{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d581ec75",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np \n",
    "import time"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87fd3f1a",
   "metadata": {},
   "source": [
    "1.读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a07f01b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.08603286743164062\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>Elevation</th>\n",
       "      <th>Aspect</th>\n",
       "      <th>Slope</th>\n",
       "      <th>Horizontal_Distance_To_Hydrology</th>\n",
       "      <th>Vertical_Distance_To_Hydrology</th>\n",
       "      <th>Horizontal_Distance_To_Roadways</th>\n",
       "      <th>Hillshade_9am</th>\n",
       "      <th>Hillshade_Noon</th>\n",
       "      <th>Hillshade_3pm</th>\n",
       "      <th>...</th>\n",
       "      <th>Soil_Type32</th>\n",
       "      <th>Soil_Type33</th>\n",
       "      <th>Soil_Type34</th>\n",
       "      <th>Soil_Type35</th>\n",
       "      <th>Soil_Type36</th>\n",
       "      <th>Soil_Type37</th>\n",
       "      <th>Soil_Type38</th>\n",
       "      <th>Soil_Type39</th>\n",
       "      <th>Soil_Type40</th>\n",
       "      <th>Cover_Type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2596</td>\n",
       "      <td>51</td>\n",
       "      <td>3</td>\n",
       "      <td>258</td>\n",
       "      <td>0</td>\n",
       "      <td>510</td>\n",
       "      <td>221</td>\n",
       "      <td>232</td>\n",
       "      <td>148</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2590</td>\n",
       "      <td>56</td>\n",
       "      <td>2</td>\n",
       "      <td>212</td>\n",
       "      <td>-6</td>\n",
       "      <td>390</td>\n",
       "      <td>220</td>\n",
       "      <td>235</td>\n",
       "      <td>151</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2804</td>\n",
       "      <td>139</td>\n",
       "      <td>9</td>\n",
       "      <td>268</td>\n",
       "      <td>65</td>\n",
       "      <td>3180</td>\n",
       "      <td>234</td>\n",
       "      <td>238</td>\n",
       "      <td>135</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2785</td>\n",
       "      <td>155</td>\n",
       "      <td>18</td>\n",
       "      <td>242</td>\n",
       "      <td>118</td>\n",
       "      <td>3090</td>\n",
       "      <td>238</td>\n",
       "      <td>238</td>\n",
       "      <td>122</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2595</td>\n",
       "      <td>45</td>\n",
       "      <td>2</td>\n",
       "      <td>153</td>\n",
       "      <td>-1</td>\n",
       "      <td>391</td>\n",
       "      <td>220</td>\n",
       "      <td>234</td>\n",
       "      <td>150</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Id  Elevation  Aspect  Slope  Horizontal_Distance_To_Hydrology  \\\n",
       "0   1       2596      51      3                               258   \n",
       "1   2       2590      56      2                               212   \n",
       "2   3       2804     139      9                               268   \n",
       "3   4       2785     155     18                               242   \n",
       "4   5       2595      45      2                               153   \n",
       "\n",
       "   Vertical_Distance_To_Hydrology  Horizontal_Distance_To_Roadways  \\\n",
       "0                               0                              510   \n",
       "1                              -6                              390   \n",
       "2                              65                             3180   \n",
       "3                             118                             3090   \n",
       "4                              -1                              391   \n",
       "\n",
       "   Hillshade_9am  Hillshade_Noon  Hillshade_3pm  ...  Soil_Type32  \\\n",
       "0            221             232            148  ...            0   \n",
       "1            220             235            151  ...            0   \n",
       "2            234             238            135  ...            0   \n",
       "3            238             238            122  ...            0   \n",
       "4            220             234            150  ...            0   \n",
       "\n",
       "   Soil_Type33  Soil_Type34  Soil_Type35  Soil_Type36  Soil_Type37  \\\n",
       "0            0            0            0            0            0   \n",
       "1            0            0            0            0            0   \n",
       "2            0            0            0            0            0   \n",
       "3            0            0            0            0            0   \n",
       "4            0            0            0            0            0   \n",
       "\n",
       "   Soil_Type38  Soil_Type39  Soil_Type40  Cover_Type  \n",
       "0            0            0            0           5  \n",
       "1            0            0            0           5  \n",
       "2            0            0            0           2  \n",
       "3            0            0            0           2  \n",
       "4            0            0            0           5  \n",
       "\n",
       "[5 rows x 56 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "start = time.time()\n",
    "df = pd.read_csv('./train_forest_covertype.csv')\n",
    "end = time.time()\n",
    "print(end-start)   #读取文件花费了多长时间\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bff37cc1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(15120, 56)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1dd4e49",
   "metadata": {},
   "source": [
    "2.数据探索与数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "39f5339a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 15120 entries, 0 to 15119\n",
      "Data columns (total 56 columns):\n",
      " #   Column                              Non-Null Count  Dtype\n",
      "---  ------                              --------------  -----\n",
      " 0   Id                                  15120 non-null  int64\n",
      " 1   Elevation                           15120 non-null  int64\n",
      " 2   Aspect                              15120 non-null  int64\n",
      " 3   Slope                               15120 non-null  int64\n",
      " 4   Horizontal_Distance_To_Hydrology    15120 non-null  int64\n",
      " 5   Vertical_Distance_To_Hydrology      15120 non-null  int64\n",
      " 6   Horizontal_Distance_To_Roadways     15120 non-null  int64\n",
      " 7   Hillshade_9am                       15120 non-null  int64\n",
      " 8   Hillshade_Noon                      15120 non-null  int64\n",
      " 9   Hillshade_3pm                       15120 non-null  int64\n",
      " 10  Horizontal_Distance_To_Fire_Points  15120 non-null  int64\n",
      " 11  Wilderness_Area1                    15120 non-null  int64\n",
      " 12  Wilderness_Area2                    15120 non-null  int64\n",
      " 13  Wilderness_Area3                    15120 non-null  int64\n",
      " 14  Wilderness_Area4                    15120 non-null  int64\n",
      " 15  Soil_Type1                          15120 non-null  int64\n",
      " 16  Soil_Type2                          15120 non-null  int64\n",
      " 17  Soil_Type3                          15120 non-null  int64\n",
      " 18  Soil_Type4                          15120 non-null  int64\n",
      " 19  Soil_Type5                          15120 non-null  int64\n",
      " 20  Soil_Type6                          15120 non-null  int64\n",
      " 21  Soil_Type7                          15120 non-null  int64\n",
      " 22  Soil_Type8                          15120 non-null  int64\n",
      " 23  Soil_Type9                          15120 non-null  int64\n",
      " 24  Soil_Type10                         15120 non-null  int64\n",
      " 25  Soil_Type11                         15120 non-null  int64\n",
      " 26  Soil_Type12                         15120 non-null  int64\n",
      " 27  Soil_Type13                         15120 non-null  int64\n",
      " 28  Soil_Type14                         15120 non-null  int64\n",
      " 29  Soil_Type15                         15120 non-null  int64\n",
      " 30  Soil_Type16                         15120 non-null  int64\n",
      " 31  Soil_Type17                         15120 non-null  int64\n",
      " 32  Soil_Type18                         15120 non-null  int64\n",
      " 33  Soil_Type19                         15120 non-null  int64\n",
      " 34  Soil_Type20                         15120 non-null  int64\n",
      " 35  Soil_Type21                         15120 non-null  int64\n",
      " 36  Soil_Type22                         15120 non-null  int64\n",
      " 37  Soil_Type23                         15120 non-null  int64\n",
      " 38  Soil_Type24                         15120 non-null  int64\n",
      " 39  Soil_Type25                         15120 non-null  int64\n",
      " 40  Soil_Type26                         15120 non-null  int64\n",
      " 41  Soil_Type27                         15120 non-null  int64\n",
      " 42  Soil_Type28                         15120 non-null  int64\n",
      " 43  Soil_Type29                         15120 non-null  int64\n",
      " 44  Soil_Type30                         15120 non-null  int64\n",
      " 45  Soil_Type31                         15120 non-null  int64\n",
      " 46  Soil_Type32                         15120 non-null  int64\n",
      " 47  Soil_Type33                         15120 non-null  int64\n",
      " 48  Soil_Type34                         15120 non-null  int64\n",
      " 49  Soil_Type35                         15120 non-null  int64\n",
      " 50  Soil_Type36                         15120 non-null  int64\n",
      " 51  Soil_Type37                         15120 non-null  int64\n",
      " 52  Soil_Type38                         15120 non-null  int64\n",
      " 53  Soil_Type39                         15120 non-null  int64\n",
      " 54  Soil_Type40                         15120 non-null  int64\n",
      " 55  Cover_Type                          15120 non-null  int64\n",
      "dtypes: int64(56)\n",
      "memory usage: 6.5 MB\n"
     ]
    }
   ],
   "source": [
    "df.info()   #查看数据类型  数据都为数值类型后续不需要进行特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "147b0c20",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Id                                    0\n",
       "Elevation                             0\n",
       "Aspect                                0\n",
       "Slope                                 0\n",
       "Horizontal_Distance_To_Hydrology      0\n",
       "Vertical_Distance_To_Hydrology        0\n",
       "Horizontal_Distance_To_Roadways       0\n",
       "Hillshade_9am                         0\n",
       "Hillshade_Noon                        0\n",
       "Hillshade_3pm                         0\n",
       "Horizontal_Distance_To_Fire_Points    0\n",
       "Wilderness_Area1                      0\n",
       "Wilderness_Area2                      0\n",
       "Wilderness_Area3                      0\n",
       "Wilderness_Area4                      0\n",
       "Soil_Type1                            0\n",
       "Soil_Type2                            0\n",
       "Soil_Type3                            0\n",
       "Soil_Type4                            0\n",
       "Soil_Type5                            0\n",
       "Soil_Type6                            0\n",
       "Soil_Type7                            0\n",
       "Soil_Type8                            0\n",
       "Soil_Type9                            0\n",
       "Soil_Type10                           0\n",
       "Soil_Type11                           0\n",
       "Soil_Type12                           0\n",
       "Soil_Type13                           0\n",
       "Soil_Type14                           0\n",
       "Soil_Type15                           0\n",
       "Soil_Type16                           0\n",
       "Soil_Type17                           0\n",
       "Soil_Type18                           0\n",
       "Soil_Type19                           0\n",
       "Soil_Type20                           0\n",
       "Soil_Type21                           0\n",
       "Soil_Type22                           0\n",
       "Soil_Type23                           0\n",
       "Soil_Type24                           0\n",
       "Soil_Type25                           0\n",
       "Soil_Type26                           0\n",
       "Soil_Type27                           0\n",
       "Soil_Type28                           0\n",
       "Soil_Type29                           0\n",
       "Soil_Type30                           0\n",
       "Soil_Type31                           0\n",
       "Soil_Type32                           0\n",
       "Soil_Type33                           0\n",
       "Soil_Type34                           0\n",
       "Soil_Type35                           0\n",
       "Soil_Type36                           0\n",
       "Soil_Type37                           0\n",
       "Soil_Type38                           0\n",
       "Soil_Type39                           0\n",
       "Soil_Type40                           0\n",
       "Cover_Type                            0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()  #查看缺失值   发现没有缺失值，不需要进行缺失值处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c5364130",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1512, 56)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_s = df.sample(frac=0.1,random_state=12)  # 抽样    参数n:按条数抽样  frac:按比例抽样  两个参数是冲突的，不能同时指定 \n",
    "#random_state随机种子，可以指定任何值\n",
    "df_s.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "da8e6fb9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5    2160\n",
       "2    2160\n",
       "1    2160\n",
       "7    2160\n",
       "3    2160\n",
       "6    2160\n",
       "4    2160\n",
       "Name: Cover_Type, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看数据目标列森林类型分布情况\n",
    "df['Cover_Type'].value_counts()   #没有数据不均衡问题，就不需要做数据不均衡处理\n",
    "# from imblearn.over_sampling import SMOTE     #过采样 用于处理数据不均衡\n",
    "# SMOTE()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d751fa43",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAINCAYAAAAA8I+NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABnIklEQVR4nO3deXxTZdr/8W/adKVQxUoLWgVHcFQUGHABRwsqm8oAVcaFUVBwZIcHOzqgKCqL+vAwjIB1BEQcRdxAnHEBxoG6MCggVWQRdariDIhVpFCatmnO7w9+jU2atmlJcs5JPu/XKy/IfZL0Su6c5cp9zn05DMMwBAAAAADwijM7AAAAAACwGhIlAAAAAPBDogQAAAAAfkiUAAAAAMAPiRIAAAAA+CFRAgAAAAA/JEoAAAAA4IdECQAAAAD8OM0OINw8Ho/++9//qnnz5nI4HGaHAwAAAMAkhmHo8OHDatOmjeLi6h8zivpE6b///a+ys7PNDgMAAACARezdu1ennnpqvY+J+kSpefPmko59GC1atDA5GgAAAABmKSkpUXZ2tjdHqE/UJ0rVp9u1aNGCRAkAAABAUJfkMJkDAAAAAPghUQIAAAAAPyRKAAAAAOAn6q9RCoZhGHK73aqqqjI7FFhAfHy8nE4n08kDAADEsJhPlCoqKrRv3z4dPXrU7FBgIampqWrdurUSExPNDgUAAAAmiOlEyePxqKioSPHx8WrTpo0SExMZRYhxhmGooqJC33//vYqKitS+ffsGi5EBAAAg+sR0olRRUSGPx6Ps7GylpqaaHQ4sIiUlRQkJCfr6669VUVGh5ORks0MCAABAhPFTucSIAWrhOwEAABDbOBoEAAAAAD8kSgAAAADgh0QphDZs2CCHw6GffvpJkvT000/rhBNOqPc506dPV+fOncMeGwAAAIDgkSjV4YknnlDz5s3ldru9bUeOHFFCQoIuvfRSn8e+++67cjgcatOmjfbt26f09PRIh2sLv//97xUfH68VK1ZE9O8++eST6tmzp1q0aOGTyAIAgGNqHu8AOIZEqQ69evXSkSNHtGXLFm/bu+++q6ysLG3evNmn7tKGDRvUpk0bdejQQVlZWRGfYryysjKif68pjh49qhdeeEF/+MMftGTJkgYfX1FREdK/3a9fP02dOjVkrwkAQLQoLCzUwIED9fHHH5sdCmApJEp1OOuss9SmTRtt2LDB27ZhwwYNHDhQv/jFL7Rx40af9l69etU69S6Qhx9+WJmZmWrevLlGjBghl8tV6zFLly7V2WefreTkZP3yl7/U448/7l321VdfyeFw6MUXX1TPnj2VnJysZ599VsOHD9egQYM0Z84ctW7dWieddJLGjh3rk0RVVFTorrvu0imnnKJmzZrpoosu8nl/X3/9tQYMGKATTzxRzZo107nnnqs33nhDknTw4EENHTpUJ598slJSUtS+fXstXbo06M/zpZde0jnnnKMpU6bo/fff11dffeWzvDr+2bNne5NOSfrPf/6j66+/XieeeKJOOukkDRw40Oe5mzdvVu/evZWRkaH09HTl5OToo48+8nntSZMm6Y9//KMuvvjioOMFACAWuN1uzZkzR6WlpZozZw4jS0ANJEr16Nmzp9avX++9v379evXs2VM5OTne9oqKCv3rX/9Sr169Gny9F198Uffff79mzpypLVu2qHXr1j5JkCQtWrRI99xzj2bOnKldu3Zp1qxZmjZtmpYtW+bzuLvvvlsTJkzQrl271LdvX298X375pdavX69ly5bp6aef1tNPP+19zq233qr3339fK1as0CeffKIhQ4aoX79++vzzzyVJY8eOVXl5ud555x1t375djzzyiNLS0iRJ06ZN086dO/Xmm29q165dys/PV0ZGRtCf5ZIlS/S73/1O6enpuuqqqwImWW+//bZ27dqldevW6e9//7uOHj2qXr16KS0tTe+8847ee+89paWlqV+/ft4Rp8OHD2vYsGF69913tWnTJrVv315XXXWVDh8+HHRsAADEqpUrV+rbb7+VJO3du1erVq0yOSLAQowod+jQIUOScejQoVrLysrKjJ07dxplZWUBn/vkk08azZo1MyorK42SkhLD6XQa3333nbFixQqjR48ehmEYRkFBgSHJ+PLLL43169cbkoyDBw8ahmEYS5cuNdLT072v1717d2PUqFE+f+Oiiy4yOnXq5L2fnZ1tLF++3OcxDz30kNG9e3fDMAyjqKjIkGTMmzfP5zHDhg0zTj/9dMPtdnvbhgwZYlx//fWGYRjGF198YTgcDuM///mPz/OuuOIKY8qUKYZhGMZ5551nTJ8+PeBnMWDAAOPWW28NuKwhe/bsMRISEozvv//eMAzDWLVqlZGdnW1UVVX5xJ+ZmWmUl5d725YsWWKcddZZhsfj8baVl5cbKSkpxpo1awL+LbfbbTRv3tz429/+VmuZf//Up6HvBgAAdvf9998bffr0MXJycry3Pn36ePfXQDSqLzfwx4hSPXr16qXS0lJt3rxZ7777rjp06KBWrVopJydHmzdvVmlpqTZs2KDTTjtNZ5xxRoOvt2vXLnXv3t2nreb977//Xnv37tWIESOUlpbmvc2YMUNffvmlz/O6detW6/XPPfdcxcfHe++3bt1aBw4ckCR99NFHMgxDHTp08HntgoIC72tPmDBBM2bM0CWXXKL7779fn3zyife1Ro8erRUrVqhz58666667fE49bMiSJUvUt29f7wjUVVddpdLSUv3jH//wedx5552nxMRE7/2tW7fqiy++UPPmzb3xtmzZUi6XyxvzgQMHNGrUKHXo0EHp6elKT0/XkSNH9M033wQdHwAAsWjhwoW1rnOurKxUfn6+SREB1uI0OwArO/PMM3Xqqadq/fr1OnjwoHJyciRJWVlZateund5//32tX79el19+eUj+nsfjkXTs9LuLLrrIZ1nNBEiSmjVrVuv5CQkJPvcdDof3NT0ej+Lj47V169Zar1V9et3IkSPVt29fvf7661q7dq1mz56t//u//9P48ePVv39/ff3113r99df1j3/8Q1dccYXGjh2rOXPm1Pueqqqq9Mwzz2j//v1yOp0+7UuWLFGfPn3qfE8ej0ddu3bVc889V+t1Tz75ZEnHrm36/vvvNW/ePJ1++ulKSkpS9+7dQzoZBAAA0Wbbtm0+lxdU83g8evvtt3XNNdeoS5cuJkQGWAeJUgOqJ2k4ePCg/vCHP3jbc3JytGbNGm3atEm33nprUK919tlna9OmTbrlllu8bZs2bfL+PzMzU6eccor+/e9/a+jQoaF7E5K6dOmiqqoqHThwoNb05jVlZ2dr1KhRGjVqlKZMmaJFixZp/Pjxko4lJ8OHD9fw4cN16aWX6g9/+EODidIbb7yhw4cPa9u2bT4J2u7duzV06FD98MMPOumkkwI+91e/+pVeeOEFtWrVSi1atAj4mHfffVePP/64rrrqKknHzq8uLi6uNyYAAGLdmjVr5HA4ZBhGrWUOh0Nr1qwhUULM49S7BvTq1UvvvfeeCgsLvSNK0rFEadGiRXK5XEFN5CBJEydO1FNPPaWnnnpKe/bs0f33368dO3b4PGb69OmaPXu2/vznP2vPnj3avn27li5dqrlz5x7X++jQoYOGDh2qW265RStXrlRRUZE2b96sRx55xDuz3aRJk7RmzRoVFRXpo48+0j//+U+dffbZkqT77rtPq1ev1hdffKEdO3bo73//u3dZfZYsWaKrr75anTp1UseOHb23a6+9VieffLKeffbZOp87dOhQZWRkaODAgXr33XdVVFSkgoICTZw40Xvh6Zlnnqm//vWv2rVrlz744AMNHTpUKSkpPq+zf/9+FRYW6osvvpAkbd++XYWFhfrxxx+b9FkCAGB3ffv2DZgkSZJhGOrXr1+EIwKsh0SpAb169VJZWZnOPPNMZWZmettzcnJ0+PBh/eIXv1B2dnZQr3X99dfrvvvu0913362uXbvq66+/1ujRo30eM3LkSC1evFhPP/20zjvvPOXk5Ojpp59Wu3btjvu9LF26VLfccovuvPNOnXXWWfrNb36jDz74wBt/VVWVxo4dq7PPPlv9+vXTWWed5Z2VLzExUVOmTNH555+vyy67LKjCsd99951ef/11XXvttbWWORwO5ebm1ltTKTU1Ve+8845OO+005ebm6uyzz9Ztt92msrIy7wjTU089pYMHD6pLly66+eabNWHCBLVq1crndZ544gl16dJFt99+uyTpsssuU5cuXfTaa68F/+EBABBFunTpossvv1xxcb6HgnFxcbriiivUuXNncwIDLMRh1PVzQpQoKSlRenq6Dh06VOv0LZfLpaKiIrVr107JyckmRQgr4rsBAIh2xcXFGjp0qMrLy71tSUlJeu655xpVAgSwk/pyA3+MKAEAAMSgjIwMjRgxwqdt5MiRJEnA/0eihOMya9Ysn+nGa9769+9vdngAAKAeubm53lPws7OzNXjwYJMjAqyDWe9wXEaNGqXf/va3AZf5T6oAAACsxel06s4779Q999yjvLw8n1IeQKxjbcBxadmypVq2bGl2GAAAoIk6d+6s1atXkyQBfjj1DgAAIMaRJAG1kSgBAICY5Ha7zQ4BgIWRKAEAgJhTWFiogQMH6uOPPzY7FAAWRaIEAABiitvt1pw5c1RaWqo5c+YwsgQgIFMTpenTp8vhcPjcsrKyvMsNw9D06dPVpk0bpaSkqGfPntqxY4eJEQMAALtbuXKlvv32W0nS3r17tWrVKpMjAmBFpo8onXvuudq3b5/3tn37du+yRx99VHPnztWCBQu0efNmZWVlqXfv3jp8+LCJEZunqqpKbrc7Yreqqiqz3zIAACFVXFysJUuW+LQtXrxYxcXFJkUEwKpMn+LE6XT6jCJVMwxD8+bN0z333KPc3FxJ0rJly5SZmanly5frjjvuiHSopqqqqlLudUN06OCPEfub6Se21MqXX1J8fHyjnvf444/rf//3f7Vv3z6de+65mjdvni699NIwRQkAQPAWLlyoyspKn7bKykrl5+dr2rRpJkUFwIpMT5Q+//xztWnTRklJSbrooos0a9YsnXHGGSoqKtL+/fvVp08f72OTkpKUk5OjjRs31pkolZeXq7y83Hu/pKQk7O8hEgzD0KGDP+rwr26RHBEYCDQ80kfPyDCMRj3thRde0KRJk/T444/rkksu0V/+8hf1799fO3fu1GmnnRamYAEAaNi2bdu0fv36Wu0ej0dvv/22rrnmGnXp0sWEyABYkamn3l100UV65plntGbNGi1atEj79+9Xjx499MMPP2j//v2SpMzMTJ/nZGZmepcFMnv2bKWnp3tv2dnZYX0PEeeIk+IicGtiMjZ37lyNGDFCI0eO1Nlnn6158+YpOztb+fn5If4gAABonDVr1sjhcARc5nA4tGbNmghHBMDKTE2U+vfvr2uvvVbnnXeerrzySr3++uuSjp1iV81/g2YYRp0bOUmaMmWKDh065L3t3bs3PMGjloqKCm3dutVnFFCS+vTpo40bN5oUFQAAx/Tt27fOMyUMw1C/fv0iHBFw/Ji1MXxMn8yhpmbNmum8887T559/7r1uyX/06MCBA7VGmWpKSkpSixYtfG6IjOLiYlVVVTV6FBAAgEjo0qWLLr/8csXF+R7+xMXF6YorrlDnzp3NCQxoIuqBhZelEqXy8nLt2rVLrVu3Vrt27ZSVlaV169Z5l1dUVKigoEA9evQwMUo0pLGjgAAARMqYMWNqTVLkdDo1evRokyICmoZ6YOFnaqKUl5engoICFRUV6YMPPtB1112nkpISDRs2TA6HQ5MmTdKsWbO0atUqffrppxo+fLhSU1N10003mRk26pCRkaH4+PhGjwICABApGRkZcjp957KKj49XRkaGSREBTUM9sPAzNVH69ttvdeONN+qss85Sbm6uEhMTtWnTJp1++umSpLvuukuTJk3SmDFj1K1bN/3nP//R2rVr1bx5czPDRh0SExPVtWtX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9PBpu+SSS9ShQweTIkK0smu9RxKlMLLjnPF79uwJWA8j1moqUE8KAIK3YMGCeu/Duu677z7vGRROp5OpwRE2dqz3SKIURnacM56aCsfYse8AwCxpaWneg57c3FylpaWZHBGClZycrFGjRkmSRo8ereTkZJMjQrSyY71HEqUwseOc8dRUOMaOfQcAZps4caLeeOMNTZgwwexQ0EjXXXed1qxZo2uvvdbsUBDl7FbvkUQpTOw4Zzw1FY6xY98BgBWkpqaaHQIaqaysTD179lTfvn1VVlZmdjiIAXYYSapGohQmdpwznpoKx9ix7wDACqw+sysANAaJUpjYcc54aiocU913/qNKVu47ADCbXWoGAkCwSJTCyI61eKipcIxd5/sHADPYrWYgAASDRCmM7FiLh5oKx2RkZGjYsGE+bXaY7x8AzGC3moEAEAwSpTCyay0eaioc85vf/Mb7/1NOOSVmrtECgMawY81AAAgGiVIY2bUWDzUVjql52uTEiRNtNUtLrKo5CYe7siJgO6zLv5/oN3uw674Ox7CeAXUjUQoTu9fioaaCr/POO8/sENAAwzCUl5fnvf96/s/X1eXl5XEwYHGGYWj69Ok+bQ888AD9ZnF239fFOv/tJusb4ItEKUyioRZPUlKS2SEAQXO5XNq5c2fAZTt37pTL5YpwRGgMl8ulPXv2+LR99tln9JvFRcO+Lpb5bzfLy8tNjAawHhKlMImGWjzMWgS7unjYH3XJiPt08bA/mh0KmuDq0bF5XaQdRcO+DkBk2SkhJ1EKEzvWUaqJehiws3hnouITEhXvTDQ7FDSBM4F+swu77+sARNbLL7+svn376pVXXjE7lKCQKIWRXWvxUA8DABAsu+7rAESWy+XSE088IUnKz8+3xanVJEphlJGRoREjRvi02aEWD/UwAADBsuu+DkBkPfjgg94f391utx566KEGnmE+EqUwy83NVXZ2tiQpOzvb8rV4qIcBAGgsu+3rAETWnj17tHHjRp+2999/v9YkPlZDohRmTqdTd955p5o1a6a8vDzL1+KhHgYAoLHstq8D7M5udefuvffegO3Tpll78h4SpQjo3LmzVq9erU6dOpkdSr2ohwEAaCq77OvwM7sdbOMYwzA0depUn7apU6datv9efPFFHThwIOCy7777Ti+99FKEIwoeiVKE2OHXtfrqXVAPAwDQEDvs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Lt+xY0eEIgnOBx98UO/yTZs2RSiSxnOaHUC0czgcmj9/vlwul5KTky1/gX1cXJz+/ve/69ChQ0pPT1dcXOzl0n369NGrr75a5/K+fftGLphGqO67H374QSeddFJM9h3szW7bSxzbHr711lsBlxmGoX79+kU4ovq1bdu23mSoXbt2kQsGaKJzzz1Xn376aZ3LaxaAtoKLL75Y77//fp3Le/ToEcFoGocjqQhwOBxKSUmxzU4/Li5OJ554YsweaE+aNKnO6uRJSUmaOHFihCMK3ieffKLhw4d7pwsF7MZu28tY16VLF11++eW19hdxcXG64oor1LlzZ3MCq8PTTz9d7/KlS5dGJhDgOCxYsKDe5fPnz49QJMGZOXNmnceUcXFxeuihhyIcUfBi80gYaEBdK62VV2a71TEBEB3GjBmjhIQEn7aEhASNHj3apIjqd9tttzWqHbCiugrMWrXw7JQpUxrVbhW2SJQef/xxtWvXTsnJyerataveffdds0NClLvwwgtrnaudkpKiCy+80KSIGma3OiYAokNGRoZGjBjh0zZy5EhlZGSYFFH9brnlFjmdvlceJCQk6JZbbjEpIqDxcnNzA36Pc3NzTYqofr179w54XNW7d2+TIgqO5ROlF154QZMmTdI999yjbdu26dJLL1X//v1r1bgBQmnPnj0B6xPs2bPHpIjqZ7c6JgCiS25urrKzsyVJ2dnZGjx4sMkR1e/ZZ5/1uf/Xv/7VpEiApikuLq4122RVVZVl9/vFxcUBywhYNd5qlk+U5s6dqxEjRmjkyJE6++yzNW/ePGVnZ1u2PgOiw7333huw3ap1lOxWxwRAdHE6nbrzzjvVrFkz5eXl1fql22qysrK8EzecccYZysrKMjkioHEWLlwYsN2q+/2FCxcGLCNg1XirWTpRqqio0NatW9WnTx+f9j59+mjjxo0Bn1NeXq6SkhKfG9AYL774og4cOBBw2XfffaeXXnopwhHVz251TABEp86dO2v16tXq1KmT2aEEZenSpXrllVcoNAvbsdt+327x1mTpRKm4uFhVVVXKzMz0ac/MzNT+/fsDPmf27NlKT0/33qpPBQCCtXr16nqX1zd1uBnsVscEQPSy+kiSv5NOOsnsEIBGs9t+327x1mTpRKma/4drGEadH/iUKVN06NAh723v3r2RCBFRZNCgQfUut9q593379q2z4rUV65gAAICms9t+327x1mTpRCkjI0Px8fG1Ro8OHDhQa5SpWlJSklq0aOFzAxpjyJAhatWqVcBlmZmZuu666yIcUf3sVscEAAA0nd32+3aLtyZLJ0qJiYnq2rWr1q1b59O+bt06S1fxhf3NmDEjYLtV6yjZrY4JAABoOrvt9+0WbzVLJ0qSNHnyZC1evFhPPfWUdu3apf/5n//RN998o1GjRpkdGqJYhw4daiXjl1xyiTp06GBSRPWzWx0TAADQdHbb79st3mqWT5Suv/56zZs3Tw8++KA6d+6sd955R2+88YZOP/10s0NDlLvvvvu8FyY7nU7LTg1ezW51TAAAQNPZbb9vt3glGyRK0rHhuq+++krl5eXaunWrLrvsMrNDQgxITk72jlyOHj1aycnJJkdUP7vVMQEAAE1nt/2+3eKVJIdR1zQUUaKkpETp6ek6dOgQEzugScrLy5WUlGR2GEFzu9222PgAAIDjZ7f9vtnxNiY3sMWIEmAmOyVJkv3qmAAAgKaz237fTvGSKAEAAACAHxIlAAAAAPBDogQAAAAAfkiUAAAAAMAPiRIAAAAA+CFRAgAAAAA/JEoAAAAA4IdECQAAAAD8kCgBAAAAgB8SJQAAAADwQ6IEAAAAAH6cZgcQboZhSJJKSkpMjgQAAACAmapzguocoT5RnygdPnxYkpSdnW1yJAAAAACs4PDhw0pPT6/3MQ4jmHTKxjwej/773/+qefPmcjgcZocTUiUlJcrOztbevXvVokULs8NBI9B39kXf2Rd9Z0/0m33Rd/YVzX1nGIYOHz6sNm3aKC6u/quQon5EKS4uTqeeeqrZYYRVixYtou5LHCvoO/ui7+yLvrMn+s2+6Dv7ita+a2gkqRqTOQAAAACAHxIlAAAAAPBDomRjSUlJuv/++5WUlGR2KGgk+s6+6Dv7ou/siX6zL/rOvui7Y6J+MgcAAAAAaCxGlAAAAADAD4kSAAAAAPghUQIAAAAAPyRKAAAAAOCHRMmm3nnnHQ0YMEBt2rSRw+HQq6++anZICMLs2bN1wQUXqHnz5mrVqpUGDRqkzz77zOyw0ID8/Hydf/753sJ73bt315tvvml2WGiC2bNny+FwaNKkSWaHggZMnz5dDofD55aVlWV2WAjSf/7zH/3ud7/TSSedpNTUVHXu3Flbt241OyzUo23btrXWOYfDobFjx5odmmlIlGyqtLRUnTp10oIFC8wOBY1QUFCgsWPHatOmTVq3bp3cbrf69Omj0tJSs0NDPU499VQ9/PDD2rJli7Zs2aLLL79cAwcO1I4dO8wODY2wefNmPfnkkzr//PPNDgVBOvfcc7Vv3z7vbfv27WaHhCAcPHhQl1xyiRISEvTmm29q586d+r//+z+dcMIJZoeGemzevNlnfVu3bp0kaciQISZHZh6n2QGgafr376/+/fubHQYa6a233vK5v3TpUrVq1Upbt27VZZddZlJUaMiAAQN87s+cOVP5+fnatGmTzj33XJOiQmMcOXJEQ4cO1aJFizRjxgyzw0GQnE4no0g29Mgjjyg7O1tLly71trVt29a8gBCUk08+2ef+ww8/rF/84hfKyckxKSLzMaIEmOjQoUOSpJYtW5ocCYJVVVWlFStWqLS0VN27dzc7HARp7Nixuvrqq3XllVeaHQoa4fPPP1ebNm3Url073XDDDfr3v/9tdkgIwmuvvaZu3bppyJAhatWqlbp06aJFixaZHRYaoaKiQs8++6xuu+02ORwOs8MxDYkSYBLDMDR58mT9+te/VseOHc0OBw3Yvn270tLSlJSUpFGjRmnVqlU655xzzA4LQVixYoU++ugjzZ492+xQ0AgXXXSRnnnmGa1Zs0aLFi3S/v371aNHD/3www9mh4YG/Pvf/1Z+fr7at2+vNWvWaNSoUZowYYKeeeYZs0NDkF599VX99NNPGj58uNmhmIpT7wCTjBs3Tp988onee+89s0NBEM466ywVFhbqp59+0iuvvKJhw4apoKCAZMni9u7dq4kTJ2rt2rVKTk42Oxw0Qs3Ty8877zx1795dv/jFL7Rs2TJNnjzZxMjQEI/Ho27dumnWrFmSpC5dumjHjh3Kz8/XLbfcYnJ0CMaSJUvUv39/tWnTxuxQTMWIEmCC8ePH67XXXtP69et16qmnmh0OgpCYmKgzzzxT3bp10+zZs9WpUyf9+c9/NjssNGDr1q06cOCAunbtKqfTKafTqYKCAj322GNyOp2qqqoyO0QEqVmzZjrvvPP0+eefmx0KGtC6detaPyKdffbZ+uabb0yKCI3x9ddf6x//+IdGjhxpdiimY0QJiCDDMDR+/HitWrVKGzZsULt27cwOCU1kGIbKy8vNDgMNuOKKK2rNlHbrrbfql7/8pe6++27Fx8ebFBkaq7y8XLt27dKll15qdihowCWXXFKr9MWePXt0+umnmxQRGqN6oqmrr77a7FBMR6JkU0eOHNEXX3zhvV9UVKTCwkK1bNlSp512momRoT5jx47V8uXLtXr1ajVv3lz79++XJKWnpyslJcXk6FCXqVOnqn///srOztbhw4e1YsUKbdiwodYshrCe5s2b17oGsFmzZjrppJO4NtDi8vLyNGDAAJ122mk6cOCAZsyYoZKSEg0bNszs0NCA//mf/1GPHj00a9Ys/fa3v9WHH36oJ598Uk8++aTZoaEBHo9HS5cu1bBhw+R0kibwCdjUli1b1KtXL+/96vO1hw0bpqefftqkqNCQ/Px8SVLPnj192pcuXRrzF0xa2Xfffaebb75Z+/btU3p6us4//3y99dZb6t27t9mhAVHr22+/1Y033qji4mKdfPLJuvjii7Vp0yZGJWzgggsu0KpVqzRlyhQ9+OCDateunebNm6ehQ4eaHRoa8I9//EPffPONbrvtNrNDsQSHYRiG2UEAAAAAgJUwmQMAAAAA+CFRAgAAAAA/JEoAAAAA4IdECQAAAAD8kCgBAAAAgB8SJQAAAADwQ6IEAAAAAH5IlAAAAADAD4kSACDk9u/fr/Hjx+uMM85QUlKSsrOzNWDAAL399ttmhxbQhg0b5HA46r09/fTTZocJAIggh2EYhtlBAACix1dffaVLLrlEJ5xwgh544AGdf/75qqys1Jo1a/Tkk09q9+7dpsRVUVGhxMTEOpf9+OOP3vsTJ05USUmJli5d6m1LT09XSkpK2OMEAFgDI0oAgJAaM2aMHA6HPvzwQ1133XXq0KGDzj33XE2ePFmbNm2SJH3zzTcaOHCg0tLS1KJFC/32t7/Vd999J0n67LPP5HA4aiVUc+fOVdu2bVX9+97OnTt11VVXKS0tTZmZmbr55ptVXFzsfXzPnj01btw4TZ48WRkZGerdu3edMScmJiorK8t7S0lJUVJSkrKysuRyudSmTRvt2LHD5znz58/X6aefLsMwvCNSr7/+ujp16qTk5GRddNFF2r59u89zNm7cqMsuu0wpKSnKzs7WhAkTVFpa2vQPGwAQNiRKAICQ+fHHH/XWW29p7NixatasWa3lJ5xwggzD0KBBg/Tjjz+qoKBA69at05dffqnrr79eknTWWWepa9eueu6553yeu3z5ct10001yOBzat2+fcnJy1LlzZ23ZskVvvfWWvvvuO/32t7/1ec6yZcvkdDr1/vvv6y9/+UuT3lPbtm115ZVX+owuSdLSpUs1fPhwORwOb9sf/vAHzZkzR5s3b1arVq30m9/8RpWVlZKk7du3q2/fvsrNzdUnn3yiF154Qe+9957GjRvXpLgAAGFmAAAQIh988IEhyVi5cmWdj1m7dq0RHx9vfPPNN962HTt2GJKMDz/80DAMw5g7d65xxhlneJd/9tlnhiRjx44dhmEYxrRp04w+ffr4vO7evXsNScZnn31mGIZh5OTkGJ07d27S+xg2bJgxcOBA7/0XXnjBOPHEEw2Xy2UYhmEUFhYaDofDKCoqMgzDMNavX29IMlasWOF9zg8//GCkpKQYL7zwgmEYhnHzzTcbv//9733+zrvvvmvExcUZZWVlTYoTABA+jCgBAELG+P+nxdUcZfG3a9cuZWdnKzs729t2zjnn6IQTTtCuXbskSTfccIO+/vpr76l6zz33nDp37qxzzjlHkrR161atX79eaWlp3tsvf/lLSdKXX37pfd1u3bqF5H0NGjRITqdTq1atkiQ99dRT6tWrl9q2bevzuO7du3v/37JlS5111lne97R161Y9/fTTPjH37dtXHo9HRUVFIYkTABA6TrMDAABEj/bt28vhcGjXrl0aNGhQwMcYhhEwkarZ3rp1a/Xq1UvLly/XxRdfrOeff1533HGH97Eej0cDBgzQI488Uut1Wrdu7f1/oNP/miIxMVE333yzli5dqtzcXC1fvlzz5s0L6rnV78nj8eiOO+7QhAkTaj3mtNNOC0mcAIDQIVECAIRMy5Yt1bdvXy1cuFATJkyolaj89NNPOuecc/TNN99o79693lGlnTt36tChQzr77LO9jx06dKjuvvtu3Xjjjfryyy91ww03eJf96le/0iuvvKK2bdvK6YzMrmzkyJHq2LGjHn/8cVVWVio3N7fWYzZt2uRNeg4ePKg9e/Z4R7p+9atfaceOHTrzzDMjEi8A4Phw6h0AIKQef/xxVVVV6cILL9Qrr7yizz//XLt27dJjjz2m7t2768orr9T555+voUOH6qOPPtKHH36oW265RTk5OT6nyuXm5qqkpESjR49Wr169dMopp3iXjR07Vj/++KNuvPFGffjhh/r3v/+ttWvX6rbbblNVVVVY3tfZZ5+tiy++2Ju8BZoq/MEHH9Tbb7+tTz/9VMOHD1dGRoZ3ZO3uu+/Wv/71L40dO1aFhYX6/PPP9dprr2n8+PFhiRcAcHxIlAAAIdWuXTt99NFH6tWrl+6880517NhRvXv31ttvv638/Hw5HA69+uqrOvHEE3XZZZfpyiuv1BlnnKEXXnjB53VatGihAQMG6OOPP9bQoUN9lrVp00bvv/++qqqq1LdvX3Xs2FETJ05Uenq64uLCt2sbMWKEKioqdNtttwVc/vDDD2vixInq2rWr9u3bp9dee81bu+n8889XQUGBPv/8c1166aXq0qWLpk2b5nOqIADAOig4CwBAkGbOnKkVK1bUqo+0YcMG9erVSwcPHtQJJ5xgTnAAgJBiRAkAgAYcOXJEmzdv1vz58wNOxgAAiD4kSgCAmPDcc8/5TM1d83buuefW+9xx48bp17/+tXJycuo87Q4AEF049Q4AEBMOHz6s7777LuCyhIQEnX766RGOCABgZSRKAAAAAOCHU+8AAAAAwA+JEgAAAAD4IVECAAAAAD8kSgAAAADgh0QJAAAAAPyQKAEAAACAHxIlAAAAAPBDogQAAAAAfv4fWW4aPwO2XUAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘图\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "plt.figure(figsize=(10,6))\n",
    "sns.boxenplot(x='Cover_Type',y='Slope',hue='Wilderness_Area1',data=df)  #箱线图，x:x坐标用哪列的数据 y:y坐标用哪列的数据\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "23c57b60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAINCAYAAADInGVbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6YUlEQVR4nO3dedyVdb3v//eKWYRbERnuvFVMNAIcwg5iKeCMOR07aslGzKFMBNk4bfJhkceg0Twbj5QeAw3duM8pyr0tFEtwikSK40SmRoIF4sAsAsL6/dHPdboFEW7vi8Utz+fjsR4P1nV913V/Futmt19ea12rVC6XywEAAKBRfaTaAwAAAHwYiS0AAIACiC0AAIACiC0AAIACiC0AAIACiC0AAIACiC0AAIACiC0AAIACNK/2AE3Fxo0b87e//S3t2rVLqVSq9jgAAECVlMvlrFy5MrW1tfnIR977/JXY2kp/+9vfUldXV+0xAACAHcTChQuz1157ved+sbWV2rVrl+Tvf6Ht27ev8jQAAEC1rFixInV1dZVGeC9iayu989bB9u3biy0AAOB9P17kAhkAAAAFEFsAAAAFEFsAAAAF8JktAAB2euVyOW+//XY2bNhQ7VHYATRr1izNmzf/wF/5JLYAANiprVu3LosWLcqbb75Z7VHYgeyyyy7p2rVrWrZs2eBjiC0AAHZaGzduzPz589OsWbPU1tamZcuWH/hsBk1buVzOunXr8uqrr2b+/Pnp3r37Fr+4eEvEFgAAO61169Zl48aNqauryy677FLtcdhBtGnTJi1atMhLL72UdevWpXXr1g06jgtkAACw02vomQs+vBrjd8JvFQAAQAHEFgAAQAHEFgAANJIZM2akVCpl2bJlSZJJkyZlt9122+JjxowZk0MOOaTw2dj+xBYAAGzGD3/4w7Rr1y5vv/12ZduqVavSokWLHHnkkfXWPvzwwymVSqmtrc2iRYtSU1OzvcdtEr70pS+lWbNmmTJlynb9ubfccksGDBiQ9u3b14vhooktAADYjIEDB2bVqlV54oknKtsefvjhdOnSJbNnz673vVwzZsxIbW1tDjjggHTp0mW7Xz5+/fr12/XnNcSbb76Zu+++O1deeWVuu+22912/bt26Rv3ZJ554Yr761a822jG3htgCAIDNOPDAA1NbW5sZM2ZUts2YMSOnnXZaPvaxj+Wxxx6rt33gwIGbvI1wc771rW+lc+fOadeuXS644IK89dZbm6yZOHFievTokdatW+fjH/94br755sq+v/zlLymVSvn3f//3DBgwIK1bt87kyZNz3nnn5fTTT8/3vve9dO3aNXvssUeGDRtWL8TWrVuXq666Kh/96EfTtm3b9O3bt97ze+mll3LKKadk9913T9u2bdOzZ8/88pe/TJIsXbo0gwcPzp577pk2bdqke/fumThx4lb/ff7v//2/84lPfCKjR4/Oo48+mr/85S/19r8z/7hx4yrhmiR//etfc/bZZ2f33XfPHnvskdNOO63eY2fPnp3jjjsuHTt2TE1NTfr375/f//739Y49cuTI/Mu//EsOP/zwrZ63MYgtAAB4DwMGDMiDDz5Yuf/ggw9mwIAB6d+/f2X7unXr8tvf/jYDBw583+P9+7//e77+9a/nm9/8Zp544ol07dq1Xkglya233pprrrkm3/zmNzNv3ryMHTs21157bW6//fZ6666++uqMGDEi8+bNywknnFCZ78UXX8yDDz6Y22+/PZMmTcqkSZMqj/niF7+YRx99NFOmTMmTTz6ZM888MyeeeGKef/75JMmwYcOydu3aPPTQQ3nqqafy7W9/O7vuumuS5Nprr82zzz6bX/3qV5k3b14mTJiQjh07bvXf5W233ZZ/+qd/Sk1NTU466aTNhtqvf/3rzJs3L9OnT89//ud/5s0338zAgQOz66675qGHHsojjzySXXfdNSeeeGLlzNfKlSszdOjQPPzww5k1a1a6d++ek046KStXrtzq2QpTZqssX768nKS8fPnyao8CAEAjWbNmTfnZZ58tr1mzZrP7b7nllnLbtm3L69evL69YsaLcvHnz8iuvvFKeMmVK+YgjjiiXy+XyzJkzy0nKL774YvnBBx8sJykvXbq0XC6XyxMnTizX1NRUjtevX7/yxRdfXO9n9O3bt3zwwQdX7tfV1ZXvuuuuemv++3//7+V+/fqVy+Vyef78+eUk5RtvvLHemqFDh5b32Wef8ttvv13ZduaZZ5bPPvvscrlcLr/wwgvlUqlU/utf/1rvccccc0x59OjR5XK5XO7du3d5zJgxm/27OOWUU8pf/OIXN7vv/fzpT38qt2jRovzqq6+Wy+VyeerUqeW6urryhg0b6s3fuXPn8tq1ayvbbrvttvKBBx5Y3rhxY2Xb2rVry23atCnfd999m/1Zb7/9drldu3bl//iP/9hk37tfny3Z0u/G1raBM1sAAPAeBg4cmNWrV2f27Nl5+OGHc8ABB6RTp07p379/Zs+endWrV2fGjBnZe++9s99++73v8ebNm5d+/frV2/aP91999dUsXLgwF1xwQXbdddfK7frrr8+LL75Y73GHHXbYJsfv2bNnmjVrVrnftWvXLFmyJEny+9//PuVyOQcccEC9Y8+cObNy7BEjRuT666/Ppz/96Xz961/Pk08+WTnWV77ylUyZMiWHHHJIrrrqqnpvo3w/t912W0444YTKmbCTTjopq1evzgMPPFBvXe/evdOyZcvK/Tlz5uSFF15Iu3btKvN26NAhb731VmXmJUuW5OKLL84BBxyQmpqa1NTUZNWqVVmwYMFWz1eU5tUeAAAAdlT7779/9tprrzz44INZunRp+vfvnyTp0qVLunXrlkcffTQPPvhgjj766Eb5eRs3bkzy97cS9u3bt96+f4yoJGnbtu0mj2/RokW9+6VSqXLMjRs3plmzZpkzZ84mx3rnrYIXXnhhTjjhhNx77725//77M27cuHz/+9/P8OHDM2jQoLz00ku5995788ADD+SYY47JsGHD8r3vfW+Lz2nDhg254447snjx4jRv3rze9ttuuy3HH3/8ez6njRs3pk+fPrnzzjs3Oe6ee+6Z5O+f9Xr11Vdz4403Zp999kmrVq3Sr1+/Rr3ARkOJLQAA2IJ3LnyxdOnSXHnllZXt/fv3z3333ZdZs2bli1/84lYdq0ePHpk1a1bOPffcyrZZs2ZV/ty5c+d89KMfzZ///OcMHjy48Z5EkkMPPTQbNmzIkiVLNrl0/T+qq6vLxRdfnIsvvjijR4/OrbfemuHDhyf5e+Ccd955Oe+883LkkUfmyiuvfN/Y+uUvf5mVK1fmD3/4Q73I++Mf/5jBgwfn9ddfzx577LHZx37yk5/M3XffnU6dOqV9+/abXfPwww/n5ptvzkknnZQkWbhwYV577bUtzrS9iC3gQ6HPlXdUe4RtNue7577/op1AU3vtvG40dU3t31xS/X93AwcOrFzV750zW8nfY+srX/lK3nrrra26OEaSXHbZZRk6dGgOO+ywfOYzn8mdd96ZZ555pt5bEMeMGZMRI0akffv2GTRoUNauXZsnnngiS5cuzahRoxr8PA444IAMHjw45557br7//e/n0EMPzWuvvZbf/OY36d27d0466aSMHDkygwYNygEHHJClS5fmN7/5TXr06JEk+drXvpY+ffqkZ8+eWbt2bf7zP/+zsm9Lbrvttnz2s5/NwQcfXG97z549M3LkyEyePDmXXXbZZh87ePDgfPe7381pp52W6667LnvttVcWLFiQn/3sZ7nyyiuz1157Zf/9989PfvKTHHbYYVmxYkWuvPLKtGnTpt5xFi9enMWLF+eFF15Ikjz11FNp165d9t5773To0KEhf51bxWe2AABgCwYOHJg1a9Zk//33T+fOnSvb+/fvn5UrV+ZjH/tY6urqtupYZ599dr72ta/l6quvTp8+ffLSSy/lK1/5Sr01F154Yf7X//pfmTRpUnr37p3+/ftn0qRJ6dat2wd+LhMnTsy5556byy+/PAceeGBOPfXU/O53v6vMv2HDhgwbNiw9evTIiSeemAMPPLBytcSWLVtm9OjROeigg3LUUUdt1ZcTv/LKK7n33nvzuc99bpN9pVIpZ5xxxha/c2uXXXbJQw89lL333jtnnHFGevTokfPPPz9r1qypnOn68Y9/nKVLl+bQQw/NkCFDMmLEiHTq1KnecX74wx/m0EMPzUUXXZQkOeqoo3LooYfmnnvu2fq/vAYolcvlcqE/4UNixYoVqampyfLly9/zFCZQPf5LbdPV1F47rxtNXVP7N5cU++/urbfeyvz589OtW7e0bt26sJ9D07Ol342tbQNntgAAAAogtgAAgAYbO3ZsvUvJ/+Nt0KBB1R6vqlwgAwAAaLCLL744Z5111mb3vftCFTsbsQUAADRYhw4dCr2iX1PmbYQAAAAFEFsAAAAFEFsAAAAFEFsAAAAFEFsAAAAFEFsAAAAFcOl3AABoQvpcecd2+1lzvntugx53880357vf/W4WLVqUnj175sYbb8yRRx7ZyNPt+JzZAgAAGs3dd9+dkSNH5pprrskf/vCHHHnkkRk0aFAWLFhQ7dG2O7EFAAA0mhtuuCEXXHBBLrzwwvTo0SM33nhj6urqMmHChGqPtt2JLQAAoFGsW7cuc+bMyfHHH19v+/HHH5/HHnusSlNVj9gCAAAaxWuvvZYNGzakc+fO9bZ37tw5ixcvrtJU1SO2AACARlUqlerdL5fLm2zbGYgtAACgUXTs2DHNmjXb5CzWkiVLNjnbtTMQWwAAQKNo2bJl+vTpk+nTp9fbPn369BxxxBFVmqp6fM8WAADQaEaNGpUhQ4bksMMOS79+/XLLLbdkwYIFufjii6s92nYntgAAoAlp6BcNby9nn312Xn/99Vx33XVZtGhRevXqlV/+8pfZZ599qj3adie2AACARnXJJZfkkksuqfYYVeczWwAAAAUQWwAAAAUQWwAAAAUQWwAAAAWoamyNGzcun/rUp9KuXbt06tQpp59+ep577rl6a8rlcsaMGZPa2tq0adMmAwYMyDPPPFNvzdq1azN8+PB07Ngxbdu2zamnnpqXX3653pqlS5dmyJAhqampSU1NTYYMGZJly5YV/RQBAICdVFVja+bMmRk2bFhmzZqV6dOn5+23387xxx+f1atXV9Z85zvfyQ033JCbbrops2fPTpcuXXLcccdl5cqVlTUjR47M1KlTM2XKlDzyyCNZtWpVTj755GzYsKGy5pxzzsncuXMzbdq0TJs2LXPnzs2QIUO26/MFAAB2HlW99Pu0adPq3Z84cWI6deqUOXPm5Kijjkq5XM6NN96Ya665JmeccUaS5Pbbb0/nzp1z11135ctf/nKWL1+e2267LT/5yU9y7LHHJkkmT56curq6PPDAAznhhBMyb968TJs2LbNmzUrfvn2TJLfeemv69euX5557LgceeOD2feIAAMCH3g71ma3ly5cnSTp06JAkmT9/fhYvXpzjjz++sqZVq1bp379/HnvssSTJnDlzsn79+npramtr06tXr8qa3/72t6mpqamEVpIcfvjhqampqax5t7Vr12bFihX1bgAAAFtrh4mtcrmcUaNG5TOf+Ux69eqVJFm8eHGSpHPnzvXWdu7cubJv8eLFadmyZXbfffctrunUqdMmP7NTp06VNe82bty4yue7ampqUldX98GeIAAAsFPZYWLr0ksvzZNPPpl/+7d/22RfqVSqd79cLm+y7d3evWZz67d0nNGjR2f58uWV28KFC7fmaQAAACSp8me23jF8+PDcc889eeihh7LXXntVtnfp0iXJ389Mde3atbJ9yZIllbNdXbp0ybp167J06dJ6Z7eWLFmSI444orLmlVde2eTnvvrqq5ucNXtHq1at0qpVqw/+5AAAoBEtuK73dvtZe3/tqW1+zEMPPZTvfve7mTNnThYtWpSpU6fm9NNPb/zhmoCqntkql8u59NJL87Of/Sy/+c1v0q1bt3r7u3Xrli5dumT69OmVbevWrcvMmTMrIdWnT5+0aNGi3ppFixbl6aefrqzp169fli9fnscff7yy5ne/+12WL19eWQMAAHxwq1evzsEHH5ybbrqp2qNUXVXPbA0bNix33XVXfvGLX6Rdu3aVz0/V1NSkTZs2KZVKGTlyZMaOHZvu3bune/fuGTt2bHbZZZecc845lbUXXHBBLr/88uyxxx7p0KFDrrjiivTu3btydcIePXrkxBNPzEUXXZQf/ehHSZIvfelLOfnkk12JEAAAGtGgQYMyaNCgao+xQ6hqbE2YMCFJMmDAgHrbJ06cmPPOOy9JctVVV2XNmjW55JJLsnTp0vTt2zf3339/2rVrV1n/gx/8IM2bN89ZZ52VNWvW5JhjjsmkSZPSrFmzypo777wzI0aMqFy18NRTT1XbAABAYaoaW+Vy+X3XlEqljBkzJmPGjHnPNa1bt8748eMzfvz491zToUOHTJ48uSFjAgAAbLMd5mqEAAAAHyZiCwAAoABiCwAAoAA7xPdsAQAAHw6rVq3KCy+8ULk/f/78zJ07Nx06dMjee+9dxcm2P7EFAABNSEO+aHh7euKJJzJw4MDK/VGjRiVJhg4dmkmTJlVpquoQWwAAQKMZMGDAVl11fGfgM1sAAAAFEFsAAAAFEFsAAAAFEFsAAAAFEFsAAOz0XNCBd2uM3wmxBQDATqtFixZJkjfffLPKk7Cjeed34p3fkYZw6XcAAHZazZo1y2677ZYlS5YkSXbZZZeUSqUqT0U1lcvlvPnmm1myZEl22223NGvWrMHHElsAAOzUunTpkiSV4IIk2W233Sq/Gw0ltgAA2KmVSqV07do1nTp1yvr166s9DjuAFi1afKAzWu8QWwAAkL+/pbAx/h9seIcLZAAAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABRAbAEAABSgebUHAAAA3l+fK++o9gjbZM53z632CFXnzBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABxBYAAEABqhpbDz30UE455ZTU1tamVCrl5z//eb395513XkqlUr3b4YcfXm/N2rVrM3z48HTs2DFt27bNqaeempdffrnemqVLl2bIkCGpqalJTU1NhgwZkmXLlhX87AAAgJ1ZVWNr9erVOfjgg3PTTTe955oTTzwxixYtqtx++ctf1ts/cuTITJ06NVOmTMkjjzySVatW5eSTT86GDRsqa84555zMnTs306ZNy7Rp0zJ37twMGTKksOcFAADQvJo/fNCgQRk0aNAW17Rq1SpdunTZ7L7ly5fntttuy09+8pMce+yxSZLJkyenrq4uDzzwQE444YTMmzcv06ZNy6xZs9K3b98kya233pp+/frlueeey4EHHti4TwoAACBN4DNbM2bMSKdOnXLAAQfkoosuypIlSyr75syZk/Xr1+f444+vbKutrU2vXr3y2GOPJUl++9vfpqamphJaSXL44YenpqamsmZz1q5dmxUrVtS7AQAAbK0dOrYGDRqUO++8M7/5zW/y/e9/P7Nnz87RRx+dtWvXJkkWL16cli1bZvfdd6/3uM6dO2fx4sWVNZ06ddrk2J06daqs2Zxx48ZVPuNVU1OTurq6RnxmAADAh11V30b4fs4+++zKn3v16pXDDjss++yzT+69996cccYZ7/m4crmcUqlUuf+Pf36vNe82evTojBo1qnJ/xYoVggsAANhqO/SZrXfr2rVr9tlnnzz//PNJki5dumTdunVZunRpvXVLlixJ586dK2teeeWVTY716quvVtZsTqtWrdK+fft6NwAAgK3VpGLr9ddfz8KFC9O1a9ckSZ8+fdKiRYtMnz69smbRokV5+umnc8QRRyRJ+vXrl+XLl+fxxx+vrPnd736X5cuXV9YAAAA0tqq+jXDVqlV54YUXKvfnz5+fuXPnpkOHDunQoUPGjBmTz33uc+natWv+8pe/5Ktf/Wo6duyY//pf/2uSpKamJhdccEEuv/zy7LHHHunQoUOuuOKK9O7du3J1wh49euTEE0/MRRddlB/96EdJki996Us5+eSTXYkQAAAoTFVj64knnsjAgQMr99/5jNTQoUMzYcKEPPXUU7njjjuybNmydO3aNQMHDszdd9+ddu3aVR7zgx/8IM2bN89ZZ52VNWvW5JhjjsmkSZPSrFmzypo777wzI0aMqFy18NRTT93id3sBAAB8UFWNrQEDBqRcLr/n/vvuu+99j9G6deuMHz8+48ePf881HTp0yOTJkxs0IwAAQEM0qc9sAQAANBViCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoABiCwAAoADNqz0AANA09bnyjmqPsE3mfPfcao8A7GSc2QIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAACiA2AIAAChAg2Lr6KOPzrJlyzbZvmLFihx99NEfdCYAAIAmr0GxNWPGjKxbt26T7W+99VYefvjhDzwUAABAU9d8WxY/+eSTlT8/++yzWbx4ceX+hg0bMm3atHz0ox9tvOkAAACaqG2KrUMOOSSlUimlUmmzbxds06ZNxo8f32jDAQAANFXbFFvz589PuVzOfvvtl8cffzx77rlnZV/Lli3TqVOnNGvWrNGHBAAAaGq2Kbb22WefJMnGjRsLGQYAAODDYpti6x/96U9/yowZM7JkyZJN4utrX/vaBx4MAACgKWtQbN166635yle+ko4dO6ZLly4plUqVfaVSSWwBAAA7vQbF1vXXX59vfvObufrqqxt7HgAAgA+FBn3P1tKlS3PmmWc29iwAAAAfGg2KrTPPPDP3339/Y88CAADwodGgtxHuv//+ufbaazNr1qz07t07LVq0qLd/xIgRjTIcAABAU9Wg2Lrllluy6667ZubMmZk5c2a9faVSSWwBAAA7vQbF1vz58xt7DgAAgA+VBn1mCwAAgC1r0Jmt888/f4v7f/zjHzdoGAAAgA+LBsXW0qVL691fv359nn766SxbtixHH310owwGAADQlDUotqZOnbrJto0bN+aSSy7Jfvvt94GHArbegut6V3uEbbL3156q9ggAANtFo31m6yMf+Uj++Z//OT/4wQ8a65AAAABNVqNeIOPFF1/M22+/3ZiHBAAAaJIa9DbCUaNG1btfLpezaNGi3HvvvRk6dGijDAYAANCUNSi2/vCHP9S7/5GPfCR77rlnvv/977/vlQoBAAB2Bg2KrQcffLCx5wAAAPhQaVBsvePVV1/Nc889l1KplAMOOCB77rlnY80FAADQpDUotlavXp3hw4fnjjvuyMaNG5MkzZo1y7nnnpvx48dnl112adQhm6I+V95R7RG2yZzvnlvtEQAA4EOlQVcjHDVqVGbOnJn/+I//yLJly7Js2bL84he/yMyZM3P55Zc39owAAABNToPObP30pz/N//k//ycDBgyobDvppJPSpk2bnHXWWZkwYUJjzQcAANAkNejM1ptvvpnOnTtvsr1Tp0558803P/BQAAAATV2DYqtfv375+te/nrfeequybc2aNfnGN76Rfv36NdpwAAAATVWD3kZ44403ZtCgQdlrr71y8MEHp1QqZe7cuWnVqlXuv//+xp4RAACgyWlQbPXu3TvPP/98Jk+enD/+8Y8pl8v5/Oc/n8GDB6dNmzaNPSMAAECT06DYGjduXDp37pyLLrqo3vYf//jHefXVV3P11Vc3ynBsPwuu613tEbbJ3l97qtojAADAFjXoM1s/+tGP8vGPf3yT7T179swPf/jDDzwUAABAU9eg2Fq8eHG6du26yfY999wzixYt+sBDAQAANHUNiq26uro8+uijm2x/9NFHU1tb+4GHAgAAaOoa9JmtCy+8MCNHjsz69etz9NFHJ0l+/etf56qrrsrll1/eqAMCAAA0RQ2KrauuuipvvPFGLrnkkqxbty5J0rp161x99dUZPXp0ow4IAADQFDUotkqlUr797W/n2muvzbx589KmTZt07949rVq1auz5AAAAmqQGxdY7dt1113zqU59qrFkAAAA+ND5QbMGHUZ8r76j2CNtkartqTwAAwOY06GqEjeWhhx7KKaecktra2pRKpfz85z+vt79cLmfMmDGpra1NmzZtMmDAgDzzzDP11qxduzbDhw9Px44d07Zt25x66ql5+eWX661ZunRphgwZkpqamtTU1GTIkCFZtmxZwc8OAADYmVU1tlavXp2DDz44N91002b3f+c738kNN9yQm266KbNnz06XLl1y3HHHZeXKlZU1I0eOzNSpUzNlypQ88sgjWbVqVU4++eRs2LChsuacc87J3LlzM23atEybNi1z587NkCFDCn9+AADAzquqbyMcNGhQBg0atNl95XI5N954Y6655pqcccYZSZLbb789nTt3zl133ZUvf/nLWb58eW677bb85Cc/ybHHHpskmTx5curq6vLAAw/khBNOyLx58zJt2rTMmjUrffv2TZLceuut6devX5577rkceOCB2+fJAgAAO5Wqntnakvnz52fx4sU5/vjjK9tatWqV/v3757HHHkuSzJkzJ+vXr6+3pra2Nr169aqs+e1vf5uamppKaCXJ4YcfnpqamsqazVm7dm1WrFhR7wYAALC1dtjYWrx4cZKkc+fO9bZ37ty5sm/x4sVp2bJldt999y2u6dSp0ybH79SpU2XN5owbN67yGa+amprU1dV9oOcDAADsXHbY2HpHqVSqd79cLm+y7d3evWZz69/vOKNHj87y5csrt4ULF27j5AAAwM5sh42tLl26JMkmZ5+WLFlSOdvVpUuXrFu3LkuXLt3imldeeWWT47/66qubnDX7R61atUr79u3r3QAAALbWDhtb3bp1S5cuXTJ9+vTKtnXr1mXmzJk54ogjkiR9+vRJixYt6q1ZtGhRnn766cqafv36Zfny5Xn88ccra373u99l+fLllTUAAACNrapXI1y1alVeeOGFyv358+dn7ty56dChQ/bee++MHDkyY8eOTffu3dO9e/eMHTs2u+yyS84555wkSU1NTS644IJcfvnl2WOPPdKhQ4dcccUV6d27d+XqhD169MiJJ56Yiy66KD/60Y+SJF/60pdy8sknuxIhAABQmKrG1hNPPJGBAwdW7o8aNSpJMnTo0EyaNClXXXVV1qxZk0suuSRLly5N3759c//996ddu3aVx/zgBz9I8+bNc9ZZZ2XNmjU55phjMmnSpDRr1qyy5s4778yIESMqVy089dRT3/O7vQAAABpDVWNrwIABKZfL77m/VCplzJgxGTNmzHuuad26dcaPH5/x48e/55oOHTpk8uTJH2RUAACAbbLDfmYLAACgKRNbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABWhe7QEAALaHBdf1rvYI22Tvrz1V7RGAD8iZLQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAKILQAAgAI0r/YAAADAh8+C63pXe4RttvfXnmrU4zmzBQAAUACxBQAAUACxBQAAUACxBQAAUIAdOrbGjBmTUqlU79alS5fK/nK5nDFjxqS2tjZt2rTJgAED8swzz9Q7xtq1azN8+PB07Ngxbdu2zamnnpqXX355ez8VAABgJ7NDx1aS9OzZM4sWLarcnnrq/10h5Dvf+U5uuOGG3HTTTZk9e3a6dOmS4447LitXrqysGTlyZKZOnZopU6bkkUceyapVq3LyySdnw4YN1Xg6AADATmKHv/R78+bN653Neke5XM6NN96Ya665JmeccUaS5Pbbb0/nzp1z11135ctf/nKWL1+e2267LT/5yU9y7LHHJkkmT56curq6PPDAAznhhBO263MBAAB2Hjv8ma3nn38+tbW16datWz7/+c/nz3/+c5Jk/vz5Wbx4cY4//vjK2latWqV///557LHHkiRz5szJ+vXr662pra1Nr169Kmvey9q1a7NixYp6NwAAgK21Q8dW3759c8cdd+S+++7LrbfemsWLF+eII47I66+/nsWLFydJOnfuXO8xnTt3ruxbvHhxWrZsmd133/0917yXcePGpaampnKrq6trxGcGAAB82O3QsTVo0KB87nOfS+/evXPsscfm3nvvTfL3twu+o1Qq1XtMuVzeZNu7bc2a0aNHZ/ny5ZXbwoULG/gsAACAndEOHVvv1rZt2/Tu3TvPP/985XNc7z5DtWTJksrZri5dumTdunVZunTpe655L61atUr79u3r3QAAALZWk4qttWvXZt68eenatWu6deuWLl26ZPr06ZX969aty8yZM3PEEUckSfr06ZMWLVrUW7No0aI8/fTTlTUAAABF2KGvRnjFFVfklFNOyd57750lS5bk+uuvz4oVKzJ06NCUSqWMHDkyY8eOTffu3dO9e/eMHTs2u+yyS84555wkSU1NTS644IJcfvnl2WOPPdKhQ4dcccUVlbclAgAAFGWHjq2XX345X/jCF/Laa69lzz33zOGHH55Zs2Zln332SZJcddVVWbNmTS655JIsXbo0ffv2zf3335927dpVjvGDH/wgzZs3z1lnnZU1a9bkmGOOyaRJk9KsWbNqPS0AAGAnsEPH1pQpU7a4v1QqZcyYMRkzZsx7rmndunXGjx+f8ePHN/J0AAAA761JfWYLAACgqRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABRBbAAAABdipYuvmm29Ot27d0rp16/Tp0ycPP/xwtUcCAAA+pHaa2Lr77rszcuTIXHPNNfnDH/6QI488MoMGDcqCBQuqPRoAAPAhtNPE1g033JALLrggF154YXr06JEbb7wxdXV1mTBhQrVHAwAAPoSaV3uA7WHdunWZM2dO/uVf/qXe9uOPPz6PPfbYZh+zdu3arF27tnJ/+fLlSZIVK1Zs1c/csHZNA6etjpUtNlR7hG2yta9DQ3jtilXUa9fUXrek2N/jpqSpvXZet/+nqb12/u/l3zW11y3x7+4dTe21a2r/5pKt/117Z125XN7iulL5/VZ8CPztb3/LRz/60Tz66KM54ogjKtvHjh2b22+/Pc8999wmjxkzZky+8Y1vbM8xAQCAJmThwoXZa6+93nP/TnFm6x2lUqne/XK5vMm2d4wePTqjRo2q3N+4cWPeeOON7LHHHu/5mKZqxYoVqaury8KFC9O+fftqj8M28No1XV67psnr1nR57Zour13T9GF/3crlclauXJna2totrtspYqtjx45p1qxZFi9eXG/7kiVL0rlz580+plWrVmnVqlW9bbvttltRI+4Q2rdv/6H8x7Az8No1XV67psnr1nR57Zour13T9GF+3Wpqat53zU5xgYyWLVumT58+mT59er3t06dPr/e2QgAAgMayU5zZSpJRo0ZlyJAhOeyww9KvX7/ccsstWbBgQS6++OJqjwYAAHwI7TSxdfbZZ+f111/Pddddl0WLFqVXr1755S9/mX322afao1Vdq1at8vWvf32Tt02y4/PaNV1eu6bJ69Z0ee2aLq9d0+R1+7ud4mqEAAAA29tO8ZktAACA7U1sAQAAFEBsAQAAFEBsAQAAFEBs7cQeeuihnHLKKamtrU2pVMrPf/7zao/EVhg3blw+9alPpV27dunUqVNOP/30PPfcc9Uei60wYcKEHHTQQZUveOzXr19+9atfVXssGmDcuHEplUoZOXJktUfhfYwZMyalUqnerUuXLtUei63w17/+Nf/0T/+UPfbYI7vssksOOeSQzJkzp9pj8T723XffTf7NlUqlDBs2rNqjVYXY2omtXr06Bx98cG666aZqj8I2mDlzZoYNG5ZZs2Zl+vTpefvtt3P88cdn9erV1R6N97HXXnvlW9/6Vp544ok88cQTOfroo3PaaaflmWeeqfZobIPZs2fnlltuyUEHHVTtUdhKPXv2zKJFiyq3p556qtoj8T6WLl2aT3/602nRokV+9atf5dlnn833v//97LbbbtUejfcxe/bsev/epk+fniQ588wzqzxZdew037PFpgYNGpRBgwZVewy20bRp0+rdnzhxYjp16pQ5c+bkqKOOqtJUbI1TTjml3v1vfvObmTBhQmbNmpWePXtWaSq2xapVqzJ48ODceuutuf7666s9DlupefPmzmY1Md/+9rdTV1eXiRMnVrbtu+++1RuIrbbnnnvWu/+tb30rH/vYx9K/f/8qTVRdzmxBE7d8+fIkSYcOHao8Cdtiw4YNmTJlSlavXp1+/fpVexy20rBhw/LZz342xx57bLVHYRs8//zzqa2tTbdu3fL5z38+f/7zn6s9Eu/jnnvuyWGHHZYzzzwznTp1yqGHHppbb7212mOxjdatW5fJkyfn/PPPT6lUqvY4VSG2oAkrl8sZNWpUPvOZz6RXr17VHoet8NRTT2XXXXdNq1atcvHFF2fq1Kn5xCc+Ue2x2ApTpkzJ73//+4wbN67ao7AN+vbtmzvuuCP33Xdfbr311ixevDhHHHFEXn/99WqPxhb8+c9/zoQJE9K9e/fcd999ufjiizNixIjccccd1R6NbfDzn/88y5Yty3nnnVftUarG2wihCbv00kvz5JNP5pFHHqn2KGylAw88MHPnzs2yZcvy05/+NEOHDs3MmTMF1w5u4cKFueyyy3L//fendevW1R6HbfCPb5fv3bt3+vXrl4997GO5/fbbM2rUqCpOxpZs3Lgxhx12WMaOHZskOfTQQ/PMM89kwoQJOffcc6s8HVvrtttuy6BBg1JbW1vtUarGmS1oooYPH5577rknDz74YPbaa69qj8NWatmyZfbff/8cdthhGTduXA4++OD8j//xP6o9Fu9jzpw5WbJkSfr06ZPmzZunefPmmTlzZv71X/81zZs3z4YNG6o9Ilupbdu26d27d55//vlqj8IWdO3adZP/CNWjR48sWLCgShOxrV566aU88MADufDCC6s9SlU5swVNTLlczvDhwzN16tTMmDEj3bp1q/ZIfADlcjlr166t9hi8j2OOOWaTK9h98YtfzMc//vFcffXVadasWZUmY1utXbs28+bNy5FHHlntUdiCT3/605t8rcmf/vSn7LPPPlWaiG31zgW8PvvZz1Z7lKoSWzuxVatW5YUXXqjcnz9/fubOnZsOHTpk7733ruJkbMmwYcNy11135Re/+EXatWuXxYsXJ0lqamrSpk2bKk/Hlnz1q1/NoEGDUldXl5UrV2bKlCmZMWPGJleYZMfTrl27TT4X2bZt2+yxxx4+L7mDu+KKK3LKKadk7733zpIlS3L99ddnxYoVGTp0aLVHYwv++Z//OUcccUTGjh2bs846K48//nhuueWW3HLLLdUeja2wcePGTJw4MUOHDk3z5jt3buzcz34n98QTT2TgwIGV+++8d33o0KGZNGlSlabi/UyYMCFJMmDAgHrbJ06cuFN/ALUpeOWVVzJkyJAsWrQoNTU1OeiggzJt2rQcd9xx1R4NPrRefvnlfOELX8hrr72WPffcM4cffnhmzZrlDMkO7lOf+lSmTp2a0aNH57rrrku3bt1y4403ZvDgwdUeja3wwAMPZMGCBTn//POrPUrVlcrlcrnaQwAAAHzYuEAGAABAAcQWAABAAcQWAABAAcQWAABAAcQWAABAAcQWAABAAcQWAABAAcQWAABAAcQWADusxYsXZ/jw4dlvv/3SqlWr1NXV5ZRTTsmvf/3rao+2WTNmzEipVNribdKkSdUeE4DtpFQul8vVHgIA3u0vf/lLPv3pT2e33XbLN77xjRx00EFZv3597rvvvtxyyy354x//WJW51q1bl5YtW77nvjfeeKNy/7LLLsuKFSsyceLEyraampq0adOm8DkBqD5ntgDYIV1yySUplUp5/PHH89/+23/LAQcckJ49e2bUqFGZNWtWkmTBggU57bTTsuuuu6Z9+/Y566yz8sorryRJnnvuuZRKpU2i7IYbbsi+++6bd/5b47PPPpuTTjopu+66azp37pwhQ4bktddeq6wfMGBALr300owaNSodO3bMcccd954zt2zZMl26dKnc2rRpk1atWqVLly556623Ultbm2eeeabeY8aPH5999tkn5XK5cmbs3nvvzcEHH5zWrVunb9++eeqpp+o95rHHHstRRx2VNm3apK6uLiNGjMjq1asb/pcNQCHEFgA7nDfeeCPTpk3LsGHD0rZt203277bbbimXyzn99NPzxhtvZObMmZk+fXpefPHFnH322UmSAw88MH369Mmdd95Z77F33XVXzjnnnJRKpSxatCj9+/fPIYcckieeeCLTpk3LK6+8krPOOqveY26//fY0b948jz76aH70ox816Dntu+++OfbYY+ud5UqSiRMn5rzzzkupVKpsu/LKK/O9730vs2fPTqdOnXLqqadm/fr1SZKnnnoqJ5xwQs4444w8+eSTufvuu/PII4/k0ksvbdBcABSoDAA7mN/97nflJOWf/exn77nm/vvvLzdr1qy8YMGCyrZnnnmmnKT8+OOPl8vlcvmGG24o77fffpX9zz33XDlJ+ZlnnimXy+XytddeWz7++OPrHXfhwoXlJOXnnnuuXC6Xy/379y8fcsghDXoeQ4cOLZ922mmV+3fffXd59913L7/11lvlcrlcnjt3brlUKpXnz59fLpfL5QcffLCcpDxlypTKY15//fVymzZtynfffXe5XC6XhwwZUv7Sl75U7+c8/PDD5Y985CPlNWvWNGhOAIrhzBYAO5zy//8Wv3882/Nu8+bNS11dXerq6irbPvGJT2S33XbLvHnzkiSf//zn89JLL1XednjnnXfmkEMOySc+8YkkyZw5c/Lggw9m1113rdw+/vGPJ0lefPHFynEPO+ywRnlep59+epo3b56pU6cmSX784x9n4MCB2Xfffeut69evX+XPHTp0yIEHHlh5TnPmzMmkSZPqzXzCCSdk48aNmT9/fqPMCUDjaF7tAQDg3bp3755SqZR58+bl9NNP3+yacrm82Rj7x+1du3bNwIEDc9ddd+Xwww/Pv/3bv+XLX/5yZe3GjRtzyimn5Nvf/vYmx+natWvlz5t7K2NDtGzZMkOGDMnEiRNzxhln5K677sqNN964VY995zlt3LgxX/7ylzNixIhN1uy9996NMicAjUNsAbDD6dChQ0444YT8z//5PzNixIhNYmfZsmX5xCc+kQULFmThwoWVs1vPPvtsli9fnh49elTWDh48OFdffXW+8IUv5MUXX8znP//5yr5PfvKT+elPf5p99903zZtvn/9JvPDCC9OrV6/cfPPNWb9+fc4444xN1syaNasSTkuXLs2f/vSnyhm3T37yk3nmmWey//77b5d5AWg4byMEYId08803Z8OGDfkv/+W/5Kc//Wmef/75zJs3L//6r/+afv365dhjj81BBx2UwYMH5/e//30ef/zxnHvuuenfv3+9t/2dccYZWbFiRb7yla9k4MCB+ehHP1rZN2zYsLzxxhv5whe+kMcffzx//vOfc//99+f888/Phg0bCnlePXr0yOGHH14JwM1dBv66667Lr3/96zz99NM577zz0rFjx8oZvquvvjq//e1vM2zYsMydOzfPP/987rnnngwfPryQeQFoOLEFwA6pW7du+f3vf5+BAwfm8ssvT69evXLcccfl17/+dSZMmJBSqZSf//zn2X333XPUUUfl2GOPzX777Ze777673nHat2+fU045Jf/3//7fDB48uN6+2traPProo9mwYUNOOOGE9OrVK5dddllqamrykY8U9z+RF1xwQdatW5fzzz9/s/u/9a1v5bLLLkufPn2yaNGi3HPPPZXv9jrooIMyc+bMPP/88znyyCNz6KGH5tprr633tkcAdgy+1BgAtrNvfvObmTJlyibfnzVjxowMHDgwS5cuzW677Vad4QBoNM5sAcB2smrVqsyePTvjx4/f7AUuAPhwEVsAsA3uvPPOepdd/8dbz549t/jYSy+9NJ/5zGfSv3//93wLIQAfHt5GCADbYOXKlXnllVc2u69FixbZZ599tvNEAOyoxBYAAEABvI0QAACgAGILAACgAGILAACgAGILAACgAGILAACgAGILAACgAGILAACgAGILAACgAP8fcX6rXX/YE/4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 柱状图\n",
    "plt.figure(figsize=(10,6))\n",
    "sns.countplot(x=\"Cover_Type\", hue='Wilderness_Area1',data=df)   # Wilderness_Area1：图例，表示画出的图中缩略图每个颜色表示啥\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6002c6ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id\n",
      "1        1\n",
      "10086    1\n",
      "10074    1\n",
      "10075    1\n",
      "10076    1\n",
      "        ..\n",
      "5044     1\n",
      "5045     1\n",
      "5046     1\n",
      "5047     1\n",
      "15120    1\n",
      "Name: Id, Length: 15120, dtype: int64\n",
      "Elevation\n",
      "2830    25\n",
      "2290    25\n",
      "3371    24\n",
      "2952    23\n",
      "2955    23\n",
      "        ..\n",
      "3692     1\n",
      "3694     1\n",
      "3702     1\n",
      "3728     1\n",
      "3604     1\n",
      "Name: Elevation, Length: 1665, dtype: int64\n",
      "Aspect\n",
      "45     117\n",
      "0      110\n",
      "90     109\n",
      "63      89\n",
      "76      87\n",
      "      ... \n",
      "263     10\n",
      "248     10\n",
      "249      9\n",
      "226      7\n",
      "360      2\n",
      "Name: Aspect, Length: 361, dtype: int64\n",
      "Slope\n",
      "11    740\n",
      "10    739\n",
      "13    717\n",
      "14    699\n",
      "12    677\n",
      "15    664\n",
      "9     664\n",
      "16    640\n",
      "17    598\n",
      "8     574\n",
      "7     573\n",
      "18    558\n",
      "20    552\n",
      "19    519\n",
      "21    465\n",
      "6     465\n",
      "22    458\n",
      "23    450\n",
      "5     423\n",
      "24    394\n",
      "25    359\n",
      "26    329\n",
      "28    313\n",
      "4     305\n",
      "27    297\n",
      "29    258\n",
      "31    218\n",
      "30    216\n",
      "3     210\n",
      "32    187\n",
      "33    143\n",
      "2     134\n",
      "34    131\n",
      "35    101\n",
      "1      78\n",
      "36     68\n",
      "37     58\n",
      "38     36\n",
      "39     32\n",
      "41     18\n",
      "40     16\n",
      "46     15\n",
      "44      5\n",
      "0       5\n",
      "49      5\n",
      "45      3\n",
      "47      3\n",
      "42      3\n",
      "43      2\n",
      "48      1\n",
      "52      1\n",
      "50      1\n",
      "Name: Slope, dtype: int64\n",
      "Horizontal_Distance_To_Hydrology\n",
      "0       1590\n",
      "30      1207\n",
      "150      497\n",
      "60       490\n",
      "42       452\n",
      "        ... \n",
      "828        1\n",
      "972        1\n",
      "1148       1\n",
      "930        1\n",
      "1199       1\n",
      "Name: Horizontal_Distance_To_Hydrology, Length: 400, dtype: int64\n",
      "Vertical_Distance_To_Hydrology\n",
      " 0      1890\n",
      " 5       217\n",
      " 3       206\n",
      " 4       200\n",
      " 8       198\n",
      "        ... \n",
      " 325       1\n",
      " 289       1\n",
      " 274       1\n",
      " 288       1\n",
      "-89        1\n",
      "Name: Vertical_Distance_To_Hydrology, Length: 423, dtype: int64\n",
      "Horizontal_Distance_To_Roadways\n",
      "150     88\n",
      "120     56\n",
      "390     47\n",
      "618     45\n",
      "1110    43\n",
      "        ..\n",
      "4692     1\n",
      "5219     1\n",
      "2937     1\n",
      "5498     1\n",
      "1833     1\n",
      "Name: Horizontal_Distance_To_Roadways, Length: 3250, dtype: int64\n",
      "Hillshade_9am\n",
      "226    279\n",
      "229    269\n",
      "224    265\n",
      "228    261\n",
      "230    260\n",
      "      ... \n",
      "92       1\n",
      "109      1\n",
      "65       1\n",
      "89       1\n",
      "73       1\n",
      "Name: Hillshade_9am, Length: 176, dtype: int64\n",
      "Hillshade_Noon\n",
      "225    327\n",
      "229    324\n",
      "226    320\n",
      "224    313\n",
      "230    311\n",
      "      ... \n",
      "128      1\n",
      "139      1\n",
      "115      1\n",
      "102      1\n",
      "114      1\n",
      "Name: Hillshade_Noon, Length: 141, dtype: int64\n",
      "Hillshade_3pm\n",
      "143    182\n",
      "149    161\n",
      "132    156\n",
      "133    154\n",
      "142    154\n",
      "      ... \n",
      "9        2\n",
      "1        1\n",
      "8        1\n",
      "7        1\n",
      "4        1\n",
      "Name: Hillshade_3pm, Length: 247, dtype: int64\n",
      "Horizontal_Distance_To_Fire_Points\n",
      "618     65\n",
      "541     51\n",
      "636     45\n",
      "607     43\n",
      "960     42\n",
      "        ..\n",
      "1966     1\n",
      "2052     1\n",
      "2234     1\n",
      "2384     1\n",
      "5466     1\n",
      "Name: Horizontal_Distance_To_Fire_Points, Length: 2710, dtype: int64\n",
      "Wilderness_Area1\n",
      "0    11523\n",
      "1     3597\n",
      "Name: Wilderness_Area1, dtype: int64\n",
      "Wilderness_Area2\n",
      "0    14621\n",
      "1      499\n",
      "Name: Wilderness_Area2, dtype: int64\n",
      "Wilderness_Area3\n",
      "0    8771\n",
      "1    6349\n",
      "Name: Wilderness_Area3, dtype: int64\n",
      "Wilderness_Area4\n",
      "0    10445\n",
      "1     4675\n",
      "Name: Wilderness_Area4, dtype: int64\n",
      "Soil_Type1\n",
      "0    14765\n",
      "1      355\n",
      "Name: Soil_Type1, dtype: int64\n",
      "Soil_Type2\n",
      "0    14497\n",
      "1      623\n",
      "Name: Soil_Type2, dtype: int64\n",
      "Soil_Type3\n",
      "0    14158\n",
      "1      962\n",
      "Name: Soil_Type3, dtype: int64\n",
      "Soil_Type4\n",
      "0    14277\n",
      "1      843\n",
      "Name: Soil_Type4, dtype: int64\n",
      "Soil_Type5\n",
      "0    14955\n",
      "1      165\n",
      "Name: Soil_Type5, dtype: int64\n",
      "Soil_Type6\n",
      "0    14470\n",
      "1      650\n",
      "Name: Soil_Type6, dtype: int64\n",
      "Soil_Type7\n",
      "0    15120\n",
      "Name: Soil_Type7, dtype: int64\n",
      "Soil_Type8\n",
      "0    15119\n",
      "1        1\n",
      "Name: Soil_Type8, dtype: int64\n",
      "Soil_Type9\n",
      "0    15110\n",
      "1       10\n",
      "Name: Soil_Type9, dtype: int64\n",
      "Soil_Type10\n",
      "0    12978\n",
      "1     2142\n",
      "Name: Soil_Type10, dtype: int64\n",
      "Soil_Type11\n",
      "0    14714\n",
      "1      406\n",
      "Name: Soil_Type11, dtype: int64\n",
      "Soil_Type12\n",
      "0    14893\n",
      "1      227\n",
      "Name: Soil_Type12, dtype: int64\n",
      "Soil_Type13\n",
      "0    14644\n",
      "1      476\n",
      "Name: Soil_Type13, dtype: int64\n",
      "Soil_Type14\n",
      "0    14951\n",
      "1      169\n",
      "Name: Soil_Type14, dtype: int64\n",
      "Soil_Type15\n",
      "0    15120\n",
      "Name: Soil_Type15, dtype: int64\n",
      "Soil_Type16\n",
      "0    15006\n",
      "1      114\n",
      "Name: Soil_Type16, dtype: int64\n",
      "Soil_Type17\n",
      "0    14508\n",
      "1      612\n",
      "Name: Soil_Type17, dtype: int64\n",
      "Soil_Type18\n",
      "0    15060\n",
      "1       60\n",
      "Name: Soil_Type18, dtype: int64\n",
      "Soil_Type19\n",
      "0    15074\n",
      "1       46\n",
      "Name: Soil_Type19, dtype: int64\n",
      "Soil_Type20\n",
      "0    14981\n",
      "1      139\n",
      "Name: Soil_Type20, dtype: int64\n",
      "Soil_Type21\n",
      "0    15104\n",
      "1       16\n",
      "Name: Soil_Type21, dtype: int64\n",
      "Soil_Type22\n",
      "0    14775\n",
      "1      345\n",
      "Name: Soil_Type22, dtype: int64\n",
      "Soil_Type23\n",
      "0    14363\n",
      "1      757\n",
      "Name: Soil_Type23, dtype: int64\n",
      "Soil_Type24\n",
      "0    14863\n",
      "1      257\n",
      "Name: Soil_Type24, dtype: int64\n",
      "Soil_Type25\n",
      "0    15119\n",
      "1        1\n",
      "Name: Soil_Type25, dtype: int64\n",
      "Soil_Type26\n",
      "0    15066\n",
      "1       54\n",
      "Name: Soil_Type26, dtype: int64\n",
      "Soil_Type27\n",
      "0    15105\n",
      "1       15\n",
      "Name: Soil_Type27, dtype: int64\n",
      "Soil_Type28\n",
      "0    15111\n",
      "1        9\n",
      "Name: Soil_Type28, dtype: int64\n",
      "Soil_Type29\n",
      "0    13829\n",
      "1     1291\n",
      "Name: Soil_Type29, dtype: int64\n",
      "Soil_Type30\n",
      "0    14395\n",
      "1      725\n",
      "Name: Soil_Type30, dtype: int64\n",
      "Soil_Type31\n",
      "0    14788\n",
      "1      332\n",
      "Name: Soil_Type31, dtype: int64\n",
      "Soil_Type32\n",
      "0    14430\n",
      "1      690\n",
      "Name: Soil_Type32, dtype: int64\n",
      "Soil_Type33\n",
      "0    14504\n",
      "1      616\n",
      "Name: Soil_Type33, dtype: int64\n",
      "Soil_Type34\n",
      "0    15098\n",
      "1       22\n",
      "Name: Soil_Type34, dtype: int64\n",
      "Soil_Type35\n",
      "0    15018\n",
      "1      102\n",
      "Name: Soil_Type35, dtype: int64\n",
      "Soil_Type36\n",
      "0    15110\n",
      "1       10\n",
      "Name: Soil_Type36, dtype: int64\n",
      "Soil_Type37\n",
      "0    15086\n",
      "1       34\n",
      "Name: Soil_Type37, dtype: int64\n",
      "Soil_Type38\n",
      "0    14392\n",
      "1      728\n",
      "Name: Soil_Type38, dtype: int64\n",
      "Soil_Type39\n",
      "0    14463\n",
      "1      657\n",
      "Name: Soil_Type39, dtype: int64\n",
      "Soil_Type40\n",
      "0    14661\n",
      "1      459\n",
      "Name: Soil_Type40, dtype: int64\n",
      "Cover_Type\n",
      "5    2160\n",
      "2    2160\n",
      "1    2160\n",
      "7    2160\n",
      "3    2160\n",
      "6    2160\n",
      "4    2160\n",
      "Name: Cover_Type, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "for col in df.columns:  # 查看数据每列森林类型分布情况\n",
    "    print(col)\n",
    "    print(df[col].value_counts())  #从这里可以看出Soil_Type7和Soil_Type15两列全部为0，可以考虑删掉这两列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d1bb4985",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>Elevation</th>\n",
       "      <th>Aspect</th>\n",
       "      <th>Slope</th>\n",
       "      <th>Horizontal_Distance_To_Hydrology</th>\n",
       "      <th>Vertical_Distance_To_Hydrology</th>\n",
       "      <th>Horizontal_Distance_To_Roadways</th>\n",
       "      <th>Hillshade_9am</th>\n",
       "      <th>Hillshade_Noon</th>\n",
       "      <th>Hillshade_3pm</th>\n",
       "      <th>...</th>\n",
       "      <th>Soil_Type32</th>\n",
       "      <th>Soil_Type33</th>\n",
       "      <th>Soil_Type34</th>\n",
       "      <th>Soil_Type35</th>\n",
       "      <th>Soil_Type36</th>\n",
       "      <th>Soil_Type37</th>\n",
       "      <th>Soil_Type38</th>\n",
       "      <th>Soil_Type39</th>\n",
       "      <th>Soil_Type40</th>\n",
       "      <th>Cover_Type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>15120.00000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "      <td>15120.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>7560.50000</td>\n",
       "      <td>2749.322553</td>\n",
       "      <td>156.676653</td>\n",
       "      <td>16.501587</td>\n",
       "      <td>227.195701</td>\n",
       "      <td>51.076521</td>\n",
       "      <td>1714.023214</td>\n",
       "      <td>212.704299</td>\n",
       "      <td>218.965608</td>\n",
       "      <td>135.091997</td>\n",
       "      <td>...</td>\n",
       "      <td>0.045635</td>\n",
       "      <td>0.040741</td>\n",
       "      <td>0.001455</td>\n",
       "      <td>0.006746</td>\n",
       "      <td>0.000661</td>\n",
       "      <td>0.002249</td>\n",
       "      <td>0.048148</td>\n",
       "      <td>0.043452</td>\n",
       "      <td>0.030357</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>4364.91237</td>\n",
       "      <td>417.678187</td>\n",
       "      <td>110.085801</td>\n",
       "      <td>8.453927</td>\n",
       "      <td>210.075296</td>\n",
       "      <td>61.239406</td>\n",
       "      <td>1325.066358</td>\n",
       "      <td>30.561287</td>\n",
       "      <td>22.801966</td>\n",
       "      <td>45.895189</td>\n",
       "      <td>...</td>\n",
       "      <td>0.208699</td>\n",
       "      <td>0.197696</td>\n",
       "      <td>0.038118</td>\n",
       "      <td>0.081859</td>\n",
       "      <td>0.025710</td>\n",
       "      <td>0.047368</td>\n",
       "      <td>0.214086</td>\n",
       "      <td>0.203880</td>\n",
       "      <td>0.171574</td>\n",
       "      <td>2.000066</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.00000</td>\n",
       "      <td>1863.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-146.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>3780.75000</td>\n",
       "      <td>2376.000000</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>67.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>764.000000</td>\n",
       "      <td>196.000000</td>\n",
       "      <td>207.000000</td>\n",
       "      <td>106.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>7560.50000</td>\n",
       "      <td>2752.000000</td>\n",
       "      <td>126.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>180.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>1316.000000</td>\n",
       "      <td>220.000000</td>\n",
       "      <td>223.000000</td>\n",
       "      <td>138.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>11340.25000</td>\n",
       "      <td>3104.000000</td>\n",
       "      <td>261.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>330.000000</td>\n",
       "      <td>79.000000</td>\n",
       "      <td>2270.000000</td>\n",
       "      <td>235.000000</td>\n",
       "      <td>235.000000</td>\n",
       "      <td>167.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>6.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>15120.00000</td>\n",
       "      <td>3849.000000</td>\n",
       "      <td>360.000000</td>\n",
       "      <td>52.000000</td>\n",
       "      <td>1343.000000</td>\n",
       "      <td>554.000000</td>\n",
       "      <td>6890.000000</td>\n",
       "      <td>254.000000</td>\n",
       "      <td>254.000000</td>\n",
       "      <td>248.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                Id     Elevation        Aspect         Slope  \\\n",
       "count  15120.00000  15120.000000  15120.000000  15120.000000   \n",
       "mean    7560.50000   2749.322553    156.676653     16.501587   \n",
       "std     4364.91237    417.678187    110.085801      8.453927   \n",
       "min        1.00000   1863.000000      0.000000      0.000000   \n",
       "25%     3780.75000   2376.000000     65.000000     10.000000   \n",
       "50%     7560.50000   2752.000000    126.000000     15.000000   \n",
       "75%    11340.25000   3104.000000    261.000000     22.000000   \n",
       "max    15120.00000   3849.000000    360.000000     52.000000   \n",
       "\n",
       "       Horizontal_Distance_To_Hydrology  Vertical_Distance_To_Hydrology  \\\n",
       "count                      15120.000000                    15120.000000   \n",
       "mean                         227.195701                       51.076521   \n",
       "std                          210.075296                       61.239406   \n",
       "min                            0.000000                     -146.000000   \n",
       "25%                           67.000000                        5.000000   \n",
       "50%                          180.000000                       32.000000   \n",
       "75%                          330.000000                       79.000000   \n",
       "max                         1343.000000                      554.000000   \n",
       "\n",
       "       Horizontal_Distance_To_Roadways  Hillshade_9am  Hillshade_Noon  \\\n",
       "count                     15120.000000   15120.000000    15120.000000   \n",
       "mean                       1714.023214     212.704299      218.965608   \n",
       "std                        1325.066358      30.561287       22.801966   \n",
       "min                           0.000000       0.000000       99.000000   \n",
       "25%                         764.000000     196.000000      207.000000   \n",
       "50%                        1316.000000     220.000000      223.000000   \n",
       "75%                        2270.000000     235.000000      235.000000   \n",
       "max                        6890.000000     254.000000      254.000000   \n",
       "\n",
       "       Hillshade_3pm  ...   Soil_Type32   Soil_Type33   Soil_Type34  \\\n",
       "count   15120.000000  ...  15120.000000  15120.000000  15120.000000   \n",
       "mean      135.091997  ...      0.045635      0.040741      0.001455   \n",
       "std        45.895189  ...      0.208699      0.197696      0.038118   \n",
       "min         0.000000  ...      0.000000      0.000000      0.000000   \n",
       "25%       106.000000  ...      0.000000      0.000000      0.000000   \n",
       "50%       138.000000  ...      0.000000      0.000000      0.000000   \n",
       "75%       167.000000  ...      0.000000      0.000000      0.000000   \n",
       "max       248.000000  ...      1.000000      1.000000      1.000000   \n",
       "\n",
       "        Soil_Type35   Soil_Type36   Soil_Type37   Soil_Type38   Soil_Type39  \\\n",
       "count  15120.000000  15120.000000  15120.000000  15120.000000  15120.000000   \n",
       "mean       0.006746      0.000661      0.002249      0.048148      0.043452   \n",
       "std        0.081859      0.025710      0.047368      0.214086      0.203880   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max        1.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "\n",
       "        Soil_Type40    Cover_Type  \n",
       "count  15120.000000  15120.000000  \n",
       "mean       0.030357      4.000000  \n",
       "std        0.171574      2.000066  \n",
       "min        0.000000      1.000000  \n",
       "25%        0.000000      2.000000  \n",
       "50%        0.000000      4.000000  \n",
       "75%        0.000000      6.000000  \n",
       "max        1.000000      7.000000  \n",
       "\n",
       "[8 rows x 56 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()  # 观察数据的最小最大值，看是否需要做标准化，暂时不需要做特征缩放"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "04ce89da",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from ydata_profiling import ProfileReport  \n",
    "# report = ProfileReport(df)\n",
    "# #covert profile report as html file\n",
    "# report.to_file(\"flight_data.html\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "716ed107",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.drop(['Soil_Type7','Soil_Type15'],inplace=True,axis=1)  #上面这已经观察出这两列全为0，考虑删掉，ID对目标列也无影响，也删掉"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90d59a56",
   "metadata": {},
   "source": [
    "3.使用管道进行标准化和建模"
   ]
  },
  {
   "cell_type": "raw",
   "id": "d50bb112",
   "metadata": {},
   "source": [
    "管道：可以加快处理速度，可以在其中指定数据预处理的操作或者是一些模型都可以。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "32da8d3a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "#数据拆分\n",
    "X = df.drop(axis=1,columns=['Cover_Type'])\n",
    "Y = df['Cover_Type']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "6ec8e92e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;scaler&#x27;, StandardScaler()), (&#x27;rf&#x27;, RandomForestClassifier())])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">Pipeline</label><div class=\"sk-toggleable__content\"><pre>Pipeline(steps=[(&#x27;scaler&#x27;, StandardScaler()), (&#x27;rf&#x27;, RandomForestClassifier())])</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">StandardScaler</label><div class=\"sk-toggleable__content\"><pre>StandardScaler()</pre></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier()</pre></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "Pipeline(steps=[('scaler', StandardScaler()), ('rf', RandomForestClassifier())])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.pipeline  import Pipeline #管道\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "# 标准化、建模  利用管道来标准化、建模\n",
    "\n",
    "model_pp = Pipeline([('scaler',StandardScaler()),('rf',RandomForestClassifier())])   # 管道 scaler：只是取了个名字\n",
    "model_pp.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "dfaf5288",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 7, 2, ..., 4, 2, 4], dtype=int64)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_pp.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a960cfb0",
   "metadata": {},
   "source": [
    "4.使用多个模型进行建模并将多个模型的名字、评分、参数、训练时间存储在一个DataFrame中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "1d8fea8c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression  # 用来解决分类问题的，看名字像解决回归问题的，实际上是解决分类问题的\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier,GradientBoostingClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.svm import SVC, LinearSVC\n",
    "from xgboost import XGBClassifier\n",
    "from lightgbm import LGBMClassifier\n",
    "seed = 42"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "cb4fe288",
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = LogisticRegression()  #n_jobs：指定几个线程跑\n",
    "svc = SVC(random_state=seed, probability=True)\n",
    "dtree = DecisionTreeClassifier(random_state=seed)\n",
    "rf = RandomForestClassifier(10, random_state=seed)\n",
    "gdb = GradientBoostingClassifier(random_state=seed)\n",
    "adb = AdaBoostClassifier(random_state=seed)\n",
    "xgb = XGBClassifier(random_state=seed)\n",
    "knn = KNeighborsClassifier()\n",
    "lgbm = LGBMClassifier(random_state=seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "01c51846",
   "metadata": {},
   "outputs": [],
   "source": [
    "MLA_columns = ['MLA Name', 'MLA Parameters','MLA Train Accuracy Mean', 'MLA Test Accuracy Mean', 'MLA Time']\n",
    "MLA_compare = pd.DataFrame(columns = MLA_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cf97b5e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71ce2e05",
   "metadata": {},
   "source": [
    "5.手动计算出各种关于模型的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "8e0e8d77",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression\n",
      "Decision Tree\n",
      "Random Forest\n",
      "AdaBoost\n",
      "K-Neighbors\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "first_models = [lr, dtree,rf, adb, knn]\n",
    "first_model_names = ['Logistic Regression','Decision Tree','Random Forest', 'AdaBoost', 'K-Neighbors']\n",
    "row = 0\n",
    "for model,name in zip(first_models,first_model_names):\n",
    "    model_pp = Pipeline([('scaler',StandardScaler()),('model',model)])   # 管道\n",
    "    \n",
    "    start = time.time()\n",
    "    model_pp.fit(X_train,y_train) # 训练\n",
    "    end = time.time()\n",
    "    \n",
    "    y_pre1 = model.predict(X_test)\n",
    "    test_as = accuracy_score(y_test,y_pre1) # 测试集的评分\n",
    "    y_pre2 = model.predict(X_train)\n",
    "    train_as = accuracy_score(y_train,y_pre2)# 训练集的评分\n",
    "    \n",
    "#     MLA_compare.loc[row,'MLA Name'] = name  # 名字\n",
    "#     MLA_compare.loc[row,'MLA Parameters'] = str(model.get_params)  # 参数\n",
    "#     MLA_compare.loc[row,'MLA Time'] = end-start   # 时间\n",
    "    \n",
    "#     MLA_compare.loc[row,'MLA Train Accuracy Mean'] = train_as\n",
    "#     MLA_compare.loc[row,'MLA Test Accuracy Mean'] = test_as\n",
    "    \n",
    "    #上面可以简化为一步\n",
    "    MLA_compare.loc[row,['MLA Name','MLA Parameters','MLA Time','MLA Train Accuracy Mean','MLA Test Accuracy Mean']] = [name,str(model.get_params),end-start,train_as,test_as]\n",
    "    row = row+1\n",
    "    print(name)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93f05eb0",
   "metadata": {},
   "source": [
    "6.通过cross_validate自动生成关于模型的各种指标"
   ]
  },
  {
   "cell_type": "raw",
   "id": "9a769938",
   "metadata": {},
   "source": [
    "模型的名、训练时间、训练集评分、测试集评分、预测时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "6ff94b21",
   "metadata": {},
   "outputs": [],
   "source": [
    "#把第5点手动的变成自动的\n",
    "from sklearn.model_selection import cross_validate     # 也会做交叉验证，但是会返回一个字典，用这个就不需要向第5点一样手动算评分那些了\n",
    "from sklearn.model_selection import cross_val_score    # 也是交叉验证，但是只会得到一个评分\n",
    "from sklearn.model_selection import ShuffleSplit\n",
    "\n",
    "first_models = [lr, dtree,rf, adb, knn] # 存储模型\n",
    "first_model_names = ['Logistic Regression','Decision Tree','Random Forest', 'AdaBoost', 'K-Neighbors']  # 存储模型名\n",
    "\n",
    "MLA_predict = df[['Id']] #  定义一个DataFrame来存储不同模型的预测值\n",
    "\n",
    "# 定义一个DataFrame来存储不同模型的各项指标\n",
    "MLA_columns = ['MLA Name', 'MLA Parameters','MLA Train Accuracy Mean', 'MLA Test Accuracy Mean', 'MLA Time']\n",
    "MLA_compare = pd.DataFrame(columns = MLA_columns)\n",
    "n_folds = 5\n",
    "skf = ShuffleSplit(n_splits = n_folds, test_size = 0.3, train_size = 0.6,random_state = seed )  # 切分数据使用，随机生成N份数据\n",
    "row=0\n",
    "for model,name in zip(first_models,first_model_names):\n",
    "#     cross_validate会返回一个字典，包括：模型名，训练时间，训练集评分，测试评分，预测时间..\n",
    "    cv_results = cross_validate(estimator=model,X=X,y=Y,cv=skf,return_train_score=True)\n",
    "    MLA_compare.loc[row,'MLA Name'] = name  # 名字\n",
    "    MLA_compare.loc[row,'MLA Parameters'] = str(model.get_params)  # 参数\n",
    "    MLA_compare.loc[row,'MLA Time'] = cv_results['fit_time'].mean()    \n",
    "    MLA_compare.loc[row,'MLA Train Accuracy Mean'] = cv_results['train_score'].mean()\n",
    "    MLA_compare.loc[row,'MLA Test Accuracy Mean'] = cv_results['test_score'].mean()\n",
    "    \n",
    "    model_pp = Pipeline([('scaler',StandardScaler()),('model',model)])   # 管道，这里用不用管道其实都可以\n",
    "    model_pp.fit(X_train,y_train) # 训练\n",
    "    MLA_predict[name] = model_pp.predict(X)  # 向DataFrame中添加预测值，这里其实就是新增一列name\n",
    "    row=row+1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c443f74a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MLA Name</th>\n",
       "      <th>MLA Parameters</th>\n",
       "      <th>MLA Train Accuracy Mean</th>\n",
       "      <th>MLA Test Accuracy Mean</th>\n",
       "      <th>MLA Time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Random Forest</td>\n",
       "      <td>&lt;bound method BaseEstimator.get_params of Rand...</td>\n",
       "      <td>0.994356</td>\n",
       "      <td>0.831878</td>\n",
       "      <td>0.199995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>K-Neighbors</td>\n",
       "      <td>&lt;bound method BaseEstimator.get_params of KNei...</td>\n",
       "      <td>0.870084</td>\n",
       "      <td>0.790344</td>\n",
       "      <td>0.017023</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Decision Tree</td>\n",
       "      <td>&lt;bound method BaseEstimator.get_params of Deci...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.771693</td>\n",
       "      <td>0.203055</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>AdaBoost</td>\n",
       "      <td>&lt;bound method BaseEstimator.get_params of AdaB...</td>\n",
       "      <td>0.404982</td>\n",
       "      <td>0.400573</td>\n",
       "      <td>0.920394</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Logistic Regression</td>\n",
       "      <td>&lt;bound method BaseEstimator.get_params of Logi...</td>\n",
       "      <td>0.384237</td>\n",
       "      <td>0.377513</td>\n",
       "      <td>0.659632</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              MLA Name                                     MLA Parameters  \\\n",
       "2        Random Forest  <bound method BaseEstimator.get_params of Rand...   \n",
       "4          K-Neighbors  <bound method BaseEstimator.get_params of KNei...   \n",
       "1        Decision Tree  <bound method BaseEstimator.get_params of Deci...   \n",
       "3             AdaBoost  <bound method BaseEstimator.get_params of AdaB...   \n",
       "0  Logistic Regression  <bound method BaseEstimator.get_params of Logi...   \n",
       "\n",
       "  MLA Train Accuracy Mean MLA Test Accuracy Mean  MLA Time  \n",
       "2                0.994356               0.831878  0.199995  \n",
       "4                0.870084               0.790344  0.017023  \n",
       "1                     1.0               0.771693  0.203055  \n",
       "3                0.404982               0.400573  0.920394  \n",
       "0                0.384237               0.377513  0.659632  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MLA_compare.sort_values(by='MLA Test Accuracy Mean',ascending=False)   #sort_values：排序 by：指定用哪列排序  ascending：是否升序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0bffa47b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./森林覆盖类型分类预测.pkl']"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import joblib \n",
    "joblib.dump(rf,'./森林覆盖类型分类预测.pkl')  #保存模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c68bf6e0",
   "metadata": {},
   "source": [
    "7.模型评估"
   ]
  },
  {
   "cell_type": "raw",
   "id": "f1995416",
   "metadata": {},
   "source": [
    "分类问题模型评估：这个是在2240120聚类算法03视频中才说到\n",
    "            评估角度：\n",
    "                偏差：指的是预测值和真实值之间的偏差程度\n",
    "                方差：指的是模型在相同大小的不同的数据集上的表现能力，这里一般会通过交叉验证来评估\n",
    "            好的模型：低偏差、低方差\n",
    "            过拟合：低偏差、高方差。重点\n",
    "            欠拟合：高偏差、低方差\n",
    "            分类问题偏差：从准确率、查全率、F1值、roc曲线下方面积(AUC值)去考虑，去分析偏差  在‘16森林覆盖类型分类预测.ipynb’\n",
    "            混淆矩阵：\n",
    "                P(正例/正元组)：感兴趣的类别\n",
    "                N(负例/负元组)：不感兴趣的类别\n",
    "                TP真正例：原本是正例也被预测为正例\n",
    "                TN真负例：原本为负例也被预测为负例\n",
    "                FP假正例：原本为负例被预测为正例\n",
    "                FN假负例：原本为正例被预测为负例\n",
    "                例：\n",
    "                    yes:是诈骗电话：准确率高一点，感兴趣 \n",
    "                    no:不是诈骗电话：准确率低一点，不感兴趣\n",
    "                    预测：\n",
    "                        原本为yes---->预测为yes        原本为yes---->预测为no\n",
    "                        原本为no----->预测为no         原本为no----->预测为yes\n",
    "                分类的偏差考察角度：\n",
    "                    准确率(精度)：(TP+TN)/P+N\n",
    "                    错误率(汉明损失)：(FN+FP)/P+N\n",
    "                    查准率：TP/(TP+FP),主要关注对负例的预测是否精准\n",
    "                    查全率：TP/(TP+FN),主要关注对正例的预测是否精准，也叫召回率\n",
    "                    F1值(常用)：F1值是查准率和查全率的一个调和平均值。其综合考虑了查准率和查全率\n",
    "                分类的方差考察角度：\n",
    "                    1.多做一些验证集\n",
    "                    2.交叉验证：k-fold交叉验证，k值一般指定为10，交叉验证中的评分就是偏差评估中的某一种\n",
    "        回归问题算法模型评估：\n",
    "            均方误差(MSE)：((80-81)²+(81-80)²+(82-81)²)/3，越小越好\n",
    "            均方根误差：均方误差开根号就行，在均方误差的基础之上开根号，越小越好\n",
    "            平均绝对误差：(|80-81|+|81-80|+|82-81|)/3，越小越好\n",
    "            R2:分子表示真实值与预测值的差的平方之和。分母是平方差，取值范围在0-1之间，越大越好\n",
    "                例：\n",
    "                    原来的值为：80、81、82\n",
    "                    预测的值为：81、80、81"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d30c8017",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;background-color: white;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "model_rf = RandomForestClassifier()\n",
    "model_rf.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "5dc9f658",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.metrics import accuracy_score  #  精度、准确率\n",
    "# from sklearn.metrics import recall_score # 查全率(召回率)\n",
    "# from sklearn.metrics import precision_score  # 查准率\n",
    "\n",
    "from sklearn.metrics import accuracy_score,recall_score,precision_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "688c8e77",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型准确率评分为: 0.8661816578483245\n",
      "模型查全率分为: 0.8681067776354244\n",
      "模型查准率评分为: 0.8647373501175573\n"
     ]
    }
   ],
   "source": [
    "# 注意一定不要直接用方法名当作变量名。  \n",
    "# 预测\n",
    "y_pre = model_rf.predict(X_test)\n",
    "# 评分\n",
    "accuracy_s = accuracy_score(y_test,y_pre)\n",
    "recall_s = recall_score(y_test,y_pre,average='macro')  #macro是用于多分类的，默认是binary，属于二分类\n",
    "precision_s = precision_score(y_test,y_pre,average='macro')\n",
    "print('模型准确率评分为:',accuracy_s)\n",
    "print('模型查全率分为:',recall_s)\n",
    "print('模型查准率评分为:',precision_s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "54b615c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型F1值为: 0.8651655074683333\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score   #F1值\n",
    "\n",
    "# 预测\n",
    "y_pre = model_rf.predict(X_test)\n",
    "f1_s = f1_score(y_test,y_pre,average='macro')\n",
    "print('模型F1值为:',f1_s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "d6ef0d5d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型AUC值为: 0.9855378790399458\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score   #roc曲线下方面积(AUC值)\n",
    "\n",
    "# 预测\n",
    "y_pre = model_rf.predict_proba(X_test)\n",
    "auc_s = roc_auc_score(y_test.values,y_pre,multi_class='ovo')\n",
    "print('模型AUC值为:',auc_s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "629af466",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.3792494 , 0.60431726, 0.68996598, 0.63694397, 0.69578417,\n",
       "       0.67618268, 0.74147193, 0.71404017, 0.75224533, 0.7782517 ])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score   #交叉验证  方差评估\n",
    "from sklearn.metrics import make_scorer\n",
    "cv_s = cross_val_score(estimator=model_rf,X=X,y=Y,cv=10,scoring=make_scorer(f1_score,average='macro'))  #make_scorer用来预测F1值\n",
    "cv_s  #从值可以看出，有一些评分过低，有一些高，那么就存在过拟合问题"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
